@geeqdev/geeq-sdk 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.idea/geeq_sdk.iml +12 -0
- package/.idea/modules.xml +8 -0
- package/.idea/vcs.xml +6 -0
- package/.nvmrc +1 -0
- package/CONTRIBUTING.md +20 -0
- package/dist/src/address/record-type.d.ts +10 -0
- package/dist/src/address/record-type.js +59 -0
- package/dist/src/address/record-type.js.map +1 -0
- package/dist/src/address/wallet-address.d.ts +34 -0
- package/dist/src/address/wallet-address.js +90 -0
- package/dist/src/address/wallet-address.js.map +1 -0
- package/dist/src/amount.d.ts +43 -0
- package/dist/src/amount.js +105 -0
- package/dist/src/amount.js.map +1 -0
- package/dist/src/assert.d.ts +12 -0
- package/dist/src/assert.js +24 -0
- package/dist/src/assert.js.map +1 -0
- package/dist/src/capnp/adminNetTx.capnp.d.ts +75 -0
- package/dist/src/capnp/adminNetTx.capnp.js +66 -0
- package/dist/src/capnp/adminNetTx.capnp.js.map +1 -0
- package/dist/src/capnp/appLayBlock.capnp.d.ts +26 -0
- package/dist/src/capnp/appLayBlock.capnp.js +24 -0
- package/dist/src/capnp/appLayBlock.capnp.js.map +1 -0
- package/dist/src/capnp/appLayLedger.capnp.d.ts +34 -0
- package/dist/src/capnp/appLayLedger.capnp.js +32 -0
- package/dist/src/capnp/appLayLedger.capnp.js.map +1 -0
- package/dist/src/capnp/appLayRec.capnp.d.ts +129 -0
- package/dist/src/capnp/appLayRec.capnp.js +156 -0
- package/dist/src/capnp/appLayRec.capnp.js.map +1 -0
- package/dist/src/capnp/chainStateView.capnp.d.ts +50 -0
- package/dist/src/capnp/chainStateView.capnp.js +48 -0
- package/dist/src/capnp/chainStateView.capnp.js.map +1 -0
- package/dist/src/capnp/coinAcctRec.capnp.d.ts +178 -0
- package/dist/src/capnp/coinAcctRec.capnp.js +189 -0
- package/dist/src/capnp/coinAcctRec.capnp.js.map +1 -0
- package/dist/src/capnp/genesisBlock.capnp.d.ts +61 -0
- package/dist/src/capnp/genesisBlock.capnp.js +55 -0
- package/dist/src/capnp/genesisBlock.capnp.js.map +1 -0
- package/dist/src/capnp/hubContentStmt.capnp.d.ts +63 -0
- package/dist/src/capnp/hubContentStmt.capnp.js +57 -0
- package/dist/src/capnp/hubContentStmt.capnp.js.map +1 -0
- package/dist/src/capnp/misc.capnp.d.ts +20 -0
- package/dist/src/capnp/misc.capnp.js +18 -0
- package/dist/src/capnp/misc.capnp.js.map +1 -0
- package/dist/src/capnp/netActorRec.capnp.d.ts +65 -0
- package/dist/src/capnp/netActorRec.capnp.js +65 -0
- package/dist/src/capnp/netActorRec.capnp.js.map +1 -0
- package/dist/src/capnp/nodeContentStmt.capnp.d.ts +67 -0
- package/dist/src/capnp/nodeContentStmt.capnp.js +61 -0
- package/dist/src/capnp/nodeContentStmt.capnp.js.map +1 -0
- package/dist/src/capnp/nodePayloadList.capnp.d.ts +28 -0
- package/dist/src/capnp/nodePayloadList.capnp.js +26 -0
- package/dist/src/capnp/nodePayloadList.capnp.js.map +1 -0
- package/dist/src/capnp/nodeTxList.capnp.d.ts +36 -0
- package/dist/src/capnp/nodeTxList.capnp.js +34 -0
- package/dist/src/capnp/nodeTxList.capnp.js.map +1 -0
- package/dist/src/capnp/paramAcctRec.capnp.d.ts +338 -0
- package/dist/src/capnp/paramAcctRec.capnp.js +669 -0
- package/dist/src/capnp/paramAcctRec.capnp.js.map +1 -0
- package/dist/src/capnp/payload.capnp.d.ts +237 -0
- package/dist/src/capnp/payload.capnp.js +260 -0
- package/dist/src/capnp/payload.capnp.js.map +1 -0
- package/dist/src/capnp/proxyAcctRec.capnp.d.ts +223 -0
- package/dist/src/capnp/proxyAcctRec.capnp.js +255 -0
- package/dist/src/capnp/proxyAcctRec.capnp.js.map +1 -0
- package/dist/src/capnp/relayContentStmt.capnp.d.ts +82 -0
- package/dist/src/capnp/relayContentStmt.capnp.js +85 -0
- package/dist/src/capnp/relayContentStmt.capnp.js.map +1 -0
- package/dist/src/capnp/sysAcctRec.capnp.d.ts +48 -0
- package/dist/src/capnp/sysAcctRec.capnp.js +46 -0
- package/dist/src/capnp/sysAcctRec.capnp.js.map +1 -0
- package/dist/src/capnp/userAppTx.capnp.d.ts +230 -0
- package/dist/src/capnp/userAppTx.capnp.js +270 -0
- package/dist/src/capnp/userAppTx.capnp.js.map +1 -0
- package/dist/src/capnp/userValTx.capnp.d.ts +1575 -0
- package/dist/src/capnp/userValTx.capnp.js +2004 -0
- package/dist/src/capnp/userValTx.capnp.js.map +1 -0
- package/dist/src/capnp/valLayBlock.capnp.d.ts +88 -0
- package/dist/src/capnp/valLayBlock.capnp.js +86 -0
- package/dist/src/capnp/valLayBlock.capnp.js.map +1 -0
- package/dist/src/capnp/valLayLedger.capnp.d.ts +85 -0
- package/dist/src/capnp/valLayLedger.capnp.js +75 -0
- package/dist/src/capnp/valLayLedger.capnp.js.map +1 -0
- package/dist/src/chain/geeq-chain.d.ts +474 -0
- package/dist/src/chain/geeq-chain.js +721 -0
- package/dist/src/chain/geeq-chain.js.map +1 -0
- package/dist/src/chain/geeq-node.d.ts +57 -0
- package/dist/src/chain/geeq-node.js +62 -0
- package/dist/src/chain/geeq-node.js.map +1 -0
- package/dist/src/chain/nonce-guard.d.ts +42 -0
- package/dist/src/chain/nonce-guard.js +68 -0
- package/dist/src/chain/nonce-guard.js.map +1 -0
- package/dist/src/chain/select.d.ts +40 -0
- package/dist/src/chain/select.js +114 -0
- package/dist/src/chain/select.js.map +1 -0
- package/dist/src/crypto/account-id.d.ts +35 -0
- package/dist/src/crypto/account-id.js +58 -0
- package/dist/src/crypto/account-id.js.map +1 -0
- package/dist/src/crypto/keypair.d.ts +24 -0
- package/dist/src/crypto/keypair.js +158 -0
- package/dist/src/crypto/keypair.js.map +1 -0
- package/dist/src/crypto/mnemonic.d.ts +34 -0
- package/dist/src/crypto/mnemonic.js +57 -0
- package/dist/src/crypto/mnemonic.js.map +1 -0
- package/dist/src/encoding/base64.d.ts +8 -0
- package/dist/src/encoding/base64.js +53 -0
- package/dist/src/encoding/base64.js.map +1 -0
- package/dist/src/encoding/hex.d.ts +2 -0
- package/dist/src/encoding/hex.js +35 -0
- package/dist/src/encoding/hex.js.map +1 -0
- package/dist/src/errors.d.ts +83 -0
- package/dist/src/errors.js +49 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +59 -0
- package/dist/src/index.js +53 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/ledger/coin-accounts.d.ts +42 -0
- package/dist/src/ledger/coin-accounts.js +37 -0
- package/dist/src/ledger/coin-accounts.js.map +1 -0
- package/dist/src/ledger/decode.d.ts +18 -0
- package/dist/src/ledger/decode.js +113 -0
- package/dist/src/ledger/decode.js.map +1 -0
- package/dist/src/ledger/geeq-ledger.d.ts +99 -0
- package/dist/src/ledger/geeq-ledger.js +125 -0
- package/dist/src/ledger/geeq-ledger.js.map +1 -0
- package/dist/src/ledger/net-actors.d.ts +65 -0
- package/dist/src/ledger/net-actors.js +53 -0
- package/dist/src/ledger/net-actors.js.map +1 -0
- package/dist/src/ledger/nft-records.d.ts +13 -0
- package/dist/src/ledger/nft-records.js +41 -0
- package/dist/src/ledger/nft-records.js.map +1 -0
- package/dist/src/ledger/params.d.ts +34 -0
- package/dist/src/ledger/params.js +71 -0
- package/dist/src/ledger/params.js.map +1 -0
- package/dist/src/ledger/proxy-accounts.d.ts +26 -0
- package/dist/src/ledger/proxy-accounts.js +27 -0
- package/dist/src/ledger/proxy-accounts.js.map +1 -0
- package/dist/src/net/discovery.d.ts +62 -0
- package/dist/src/net/discovery.js +136 -0
- package/dist/src/net/discovery.js.map +1 -0
- package/dist/src/net/explorer.d.ts +57 -0
- package/dist/src/net/explorer.js +64 -0
- package/dist/src/net/explorer.js.map +1 -0
- package/dist/src/net/read-ledger.d.ts +7 -0
- package/dist/src/net/read-ledger.js +39 -0
- package/dist/src/net/read-ledger.js.map +1 -0
- package/dist/src/net/routes.d.ts +49 -0
- package/dist/src/net/routes.js +70 -0
- package/dist/src/net/routes.js.map +1 -0
- package/dist/src/net/transport.d.ts +55 -0
- package/dist/src/net/transport.js +168 -0
- package/dist/src/net/transport.js.map +1 -0
- package/dist/src/net/websocket.d.ts +49 -0
- package/dist/src/net/websocket.js +54 -0
- package/dist/src/net/websocket.js.map +1 -0
- package/dist/src/runtime/bindings.d.ts +9 -0
- package/dist/src/runtime/bindings.js +27 -0
- package/dist/src/runtime/bindings.js.map +1 -0
- package/dist/src/runtime/init.d.ts +13 -0
- package/dist/src/runtime/init.js +40 -0
- package/dist/src/runtime/init.js.map +1 -0
- package/dist/src/runtime/wasm-loader.browser.d.ts +14 -0
- package/dist/src/runtime/wasm-loader.browser.js +20 -0
- package/dist/src/runtime/wasm-loader.browser.js.map +1 -0
- package/dist/src/runtime/wasm-loader.node.d.ts +7 -0
- package/dist/src/runtime/wasm-loader.node.js +14 -0
- package/dist/src/runtime/wasm-loader.node.js.map +1 -0
- package/dist/src/socket/geeq-socket.d.ts +232 -0
- package/dist/src/socket/geeq-socket.js +634 -0
- package/dist/src/socket/geeq-socket.js.map +1 -0
- package/dist/src/socket/tracked-tx.d.ts +148 -0
- package/dist/src/socket/tracked-tx.js +212 -0
- package/dist/src/socket/tracked-tx.js.map +1 -0
- package/dist/src/socket/tx-status.d.ts +69 -0
- package/dist/src/socket/tx-status.js +72 -0
- package/dist/src/socket/tx-status.js.map +1 -0
- package/dist/src/tx/attestation.d.ts +60 -0
- package/dist/src/tx/attestation.js +163 -0
- package/dist/src/tx/attestation.js.map +1 -0
- package/dist/src/tx/content.d.ts +27 -0
- package/dist/src/tx/content.js +62 -0
- package/dist/src/tx/content.js.map +1 -0
- package/dist/src/tx/encode.d.ts +60 -0
- package/dist/src/tx/encode.js +82 -0
- package/dist/src/tx/encode.js.map +1 -0
- package/dist/src/tx/expiry.d.ts +11 -0
- package/dist/src/tx/expiry.js +12 -0
- package/dist/src/tx/expiry.js.map +1 -0
- package/dist/src/tx/fee.d.ts +16 -0
- package/dist/src/tx/fee.js +29 -0
- package/dist/src/tx/fee.js.map +1 -0
- package/dist/src/tx/metadata.d.ts +39 -0
- package/dist/src/tx/metadata.js +66 -0
- package/dist/src/tx/metadata.js.map +1 -0
- package/dist/src/tx/nft.d.ts +16 -0
- package/dist/src/tx/nft.js +98 -0
- package/dist/src/tx/nft.js.map +1 -0
- package/dist/src/tx/proxy.d.ts +37 -0
- package/dist/src/tx/proxy.js +134 -0
- package/dist/src/tx/proxy.js.map +1 -0
- package/dist/src/tx/transfer.d.ts +31 -0
- package/dist/src/tx/transfer.js +123 -0
- package/dist/src/tx/transfer.js.map +1 -0
- package/dist/src/types.d.ts +448 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/tests/account-id.test.d.ts +1 -0
- package/dist/tests/account-id.test.js +27 -0
- package/dist/tests/account-id.test.js.map +1 -0
- package/dist/tests/amount.test.d.ts +1 -0
- package/dist/tests/amount.test.js +113 -0
- package/dist/tests/amount.test.js.map +1 -0
- package/dist/tests/attestation.test.d.ts +1 -0
- package/dist/tests/attestation.test.js +182 -0
- package/dist/tests/attestation.test.js.map +1 -0
- package/dist/tests/chain.test.d.ts +1 -0
- package/dist/tests/chain.test.js +647 -0
- package/dist/tests/chain.test.js.map +1 -0
- package/dist/tests/content.test.d.ts +1 -0
- package/dist/tests/content.test.js +90 -0
- package/dist/tests/content.test.js.map +1 -0
- package/dist/tests/documented-api.test.d.ts +1 -0
- package/dist/tests/documented-api.test.js +229 -0
- package/dist/tests/documented-api.test.js.map +1 -0
- package/dist/tests/explorer.test.d.ts +1 -0
- package/dist/tests/explorer.test.js +95 -0
- package/dist/tests/explorer.test.js.map +1 -0
- package/dist/tests/fee.test.d.ts +1 -0
- package/dist/tests/fee.test.js +179 -0
- package/dist/tests/fee.test.js.map +1 -0
- package/dist/tests/fixtures/build-vll.d.ts +71 -0
- package/dist/tests/fixtures/build-vll.js +141 -0
- package/dist/tests/fixtures/build-vll.js.map +1 -0
- package/dist/tests/fixtures/fake-socket.d.ts +44 -0
- package/dist/tests/fixtures/fake-socket.js +93 -0
- package/dist/tests/fixtures/fake-socket.js.map +1 -0
- package/dist/tests/fixtures/fake-transport.d.ts +24 -0
- package/dist/tests/fixtures/fake-transport.js +30 -0
- package/dist/tests/fixtures/fake-transport.js.map +1 -0
- package/dist/tests/keypair.test.d.ts +1 -0
- package/dist/tests/keypair.test.js +163 -0
- package/dist/tests/keypair.test.js.map +1 -0
- package/dist/tests/ledger.test.d.ts +1 -0
- package/dist/tests/ledger.test.js +234 -0
- package/dist/tests/ledger.test.js.map +1 -0
- package/dist/tests/mnemonic.test.d.ts +1 -0
- package/dist/tests/mnemonic.test.js +97 -0
- package/dist/tests/mnemonic.test.js.map +1 -0
- package/dist/tests/nft-transfer.test.d.ts +1 -0
- package/dist/tests/nft-transfer.test.js +170 -0
- package/dist/tests/nft-transfer.test.js.map +1 -0
- package/dist/tests/nft.test.d.ts +1 -0
- package/dist/tests/nft.test.js +180 -0
- package/dist/tests/nft.test.js.map +1 -0
- package/dist/tests/offline.test.d.ts +1 -0
- package/dist/tests/offline.test.js +95 -0
- package/dist/tests/offline.test.js.map +1 -0
- package/dist/tests/proxy.test.d.ts +1 -0
- package/dist/tests/proxy.test.js +183 -0
- package/dist/tests/proxy.test.js.map +1 -0
- package/dist/tests/select.test.d.ts +1 -0
- package/dist/tests/select.test.js +200 -0
- package/dist/tests/select.test.js.map +1 -0
- package/dist/tests/socket.test.d.ts +1 -0
- package/dist/tests/socket.test.js +607 -0
- package/dist/tests/socket.test.js.map +1 -0
- package/dist/tests/transfer.test.d.ts +1 -0
- package/dist/tests/transfer.test.js +225 -0
- package/dist/tests/transfer.test.js.map +1 -0
- package/dist/tests/wallet-address.test.d.ts +1 -0
- package/dist/tests/wallet-address.test.js +101 -0
- package/dist/tests/wallet-address.test.js.map +1 -0
- package/dist/tests/wasm-loader.jest.d.ts +13 -0
- package/dist/tests/wasm-loader.jest.js +15 -0
- package/dist/tests/wasm-loader.jest.js.map +1 -0
- package/example/.env.example +4 -0
- package/example/README.md +304 -0
- package/example/USAGE.md +74 -0
- package/example/index.html +12 -0
- package/example/package-lock.json +1557 -0
- package/example/package.json +25 -0
- package/example/scripts/browser-check.mjs +1421 -0
- package/example/scripts/match-derivation.mjs +65 -0
- package/example/src/App.vue +138 -0
- package/example/src/components/AuthorityPanel.vue +277 -0
- package/example/src/components/ChainPanel.vue +267 -0
- package/example/src/components/ChainState.vue +59 -0
- package/example/src/components/CopyButton.vue +25 -0
- package/example/src/components/CreateAssetPanel.vue +313 -0
- package/example/src/components/DigitalAssetsPanel.vue +68 -0
- package/example/src/components/EvidencePanel.vue +396 -0
- package/example/src/components/ExplorerPanel.vue +119 -0
- package/example/src/components/KeypairPanel.vue +182 -0
- package/example/src/components/PhrasePanel.vue +105 -0
- package/example/src/components/SocketWarning.vue +18 -0
- package/example/src/components/StepGate.vue +24 -0
- package/example/src/components/TransferPanel.vue +416 -0
- package/example/src/components/TxDeadline.vue +19 -0
- package/example/src/components/TxFee.vue +31 -0
- package/example/src/components/TxStatus.vue +105 -0
- package/example/src/composables/useSocketConnection.ts +80 -0
- package/example/src/env.d.ts +12 -0
- package/example/src/main.ts +5 -0
- package/example/src/pennies.ts +7 -0
- package/example/src/style.css +149 -0
- package/example/tsconfig.json +19 -0
- package/example/vite.config.ts +26 -0
- package/jest.config.js +18 -0
- package/package.json +2 -6
- package/scripts/copy-wasm.mjs +21 -0
- package/scripts/smoke.mjs +382 -0
- package/src/address/record-type.ts +77 -0
- package/src/address/wallet-address.ts +105 -0
- package/src/amount.ts +143 -0
- package/src/assert.ts +30 -0
- package/src/capnp/README.md +15 -0
- package/src/capnp/adminNetTx.capnp.ts +66 -0
- package/src/capnp/appLayBlock.capnp.ts +26 -0
- package/src/capnp/appLayLedger.capnp.ts +35 -0
- package/src/capnp/appLayRec.capnp.ts +159 -0
- package/src/capnp/chainStateView.capnp.ts +49 -0
- package/src/capnp/coinAcctRec.capnp.ts +193 -0
- package/src/capnp/genesisBlock.capnp.ts +56 -0
- package/src/capnp/hubContentStmt.capnp.ts +59 -0
- package/src/capnp/misc.capnp.ts +19 -0
- package/src/capnp/netActorRec.capnp.ts +64 -0
- package/src/capnp/nodeContentStmt.capnp.ts +62 -0
- package/src/capnp/nodePayloadList.capnp.ts +28 -0
- package/src/capnp/nodeTxList.capnp.ts +37 -0
- package/src/capnp/paramAcctRec.capnp.ts +669 -0
- package/src/capnp/payload.capnp.ts +261 -0
- package/src/capnp/proxyAcctRec.capnp.ts +259 -0
- package/src/capnp/relayContentStmt.capnp.ts +85 -0
- package/src/capnp/sysAcctRec.capnp.ts +47 -0
- package/src/capnp/userAppTx.capnp.ts +269 -0
- package/src/capnp/userValTx.capnp.ts +1999 -0
- package/src/capnp/valLayBlock.capnp.ts +93 -0
- package/src/capnp/valLayLedger.capnp.ts +80 -0
- package/src/chain/geeq-chain.ts +1094 -0
- package/src/chain/geeq-node.ts +105 -0
- package/src/chain/nonce-guard.ts +73 -0
- package/src/chain/select.ts +149 -0
- package/src/crypto/account-id.ts +83 -0
- package/src/crypto/keypair.ts +221 -0
- package/src/crypto/mnemonic.ts +69 -0
- package/src/encoding/base64.ts +58 -0
- package/src/encoding/hex.ts +42 -0
- package/src/errors.ts +122 -0
- package/src/index.ts +195 -0
- package/src/ledger/coin-accounts.ts +73 -0
- package/src/ledger/decode.ts +147 -0
- package/src/ledger/geeq-ledger.ts +184 -0
- package/src/ledger/net-actors.ts +129 -0
- package/src/ledger/nft-records.ts +49 -0
- package/src/ledger/params.ts +82 -0
- package/src/ledger/proxy-accounts.ts +51 -0
- package/src/net/discovery.ts +231 -0
- package/src/net/explorer.ts +123 -0
- package/src/net/read-ledger.ts +58 -0
- package/src/net/routes.ts +79 -0
- package/src/net/transport.ts +221 -0
- package/src/net/websocket.ts +94 -0
- package/src/runtime/bindings.ts +38 -0
- package/src/runtime/init.ts +49 -0
- package/src/runtime/wasm-loader.browser.ts +22 -0
- package/src/runtime/wasm-loader.node.ts +16 -0
- package/src/socket/geeq-socket.ts +827 -0
- package/src/socket/tracked-tx.ts +319 -0
- package/src/socket/tx-status.ts +131 -0
- package/src/tx/attestation.ts +222 -0
- package/src/tx/content.ts +82 -0
- package/src/tx/encode.ts +107 -0
- package/src/tx/expiry.ts +11 -0
- package/src/tx/fee.ts +31 -0
- package/src/tx/metadata.ts +100 -0
- package/src/tx/nft.ts +108 -0
- package/src/tx/proxy.ts +156 -0
- package/src/tx/transfer.ts +162 -0
- package/src/types.ts +503 -0
- package/src/wasm/README.md +22 -0
- package/src/wasm/browser/geeq_core.d.ts +1224 -0
- package/src/wasm/browser/geeq_core.js +6014 -0
- package/src/wasm/browser/geeq_core_bg.wasm +0 -0
- package/src/wasm/browser/geeq_core_bg.wasm.d.ts +447 -0
- package/src/wasm/nodejs/geeq_core.d.ts +753 -0
- package/src/wasm/nodejs/geeq_core.js +6016 -0
- package/src/wasm/nodejs/geeq_core_bg.wasm +0 -0
- package/src/wasm/nodejs/geeq_core_bg.wasm.d.ts +447 -0
- package/src/wasm/nodejs/package.json +3 -0
- package/tsconfig.build.json +8 -0
- package/tsconfig.json +21 -0
- package/tsup.config.ts +60 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { afterEach, beforeAll, describe, expect, it } from '@jest/globals';
|
|
2
|
+
import { GeeqChain, createAttestationTx, createCoinTransferTx, createNftMintProxyTx, createNftMintTx, decodeValidationLedger, generateKeypair, initGeeq, keypairFromMnemonic, } from '../src/index';
|
|
3
|
+
import { WasmPayload, WasmUserAppTx, WasmUserValTx } from '../src/runtime/bindings';
|
|
4
|
+
import { buildVll, vllResponse } from './fixtures/build-vll';
|
|
5
|
+
import { fakeTransport } from './fixtures/fake-transport';
|
|
6
|
+
/**
|
|
7
|
+
* The fee, as geeq_node_core charges it (wrappers/base.ts, calculateTransactionFee):
|
|
8
|
+
* geeqNorm per byte of the signed flatten (plus the payload's, for a UAT), and for anything
|
|
9
|
+
* that sends coin, a quarter of a percent of the amount, capped at geeqNorm x 10^7.
|
|
10
|
+
*/
|
|
11
|
+
const MNEMONIC = 'legal winner thank year wave sausage worth useful legal winner thank yellow';
|
|
12
|
+
const ENDPOINT = 'https://10.0.0.1:2082';
|
|
13
|
+
const ATTEST_HASH = new Uint8Array(32).fill(7);
|
|
14
|
+
let sender;
|
|
15
|
+
let receiver;
|
|
16
|
+
beforeAll(async () => {
|
|
17
|
+
await initGeeq();
|
|
18
|
+
sender = await keypairFromMnemonic(MNEMONIC);
|
|
19
|
+
receiver = await generateKeypair();
|
|
20
|
+
});
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
GeeqChain.reset();
|
|
23
|
+
});
|
|
24
|
+
const decode = (base64) => new Uint8Array(Buffer.from(base64, 'base64'));
|
|
25
|
+
/** The node's own measure: the flatten with the signature, through the non-Data class. */
|
|
26
|
+
function signedUvtBytes(transaction) {
|
|
27
|
+
const handle = WasmUserValTx.fromUserValTxCapnp(decode(transaction));
|
|
28
|
+
const length = handle.flatten().length;
|
|
29
|
+
handle.free();
|
|
30
|
+
return length;
|
|
31
|
+
}
|
|
32
|
+
function signedUatBytes(transaction, payload) {
|
|
33
|
+
const tx = WasmUserAppTx.fromUserAppTxCapnp(decode(transaction));
|
|
34
|
+
const body = WasmPayload.fromPayloadCapnp(decode(payload));
|
|
35
|
+
const length = tx.flatten().length + body.flatten().length;
|
|
36
|
+
tx.free();
|
|
37
|
+
body.free();
|
|
38
|
+
return length;
|
|
39
|
+
}
|
|
40
|
+
const state = (geeqNorm) => ({
|
|
41
|
+
chainNumber: 1,
|
|
42
|
+
blockNumber: 42,
|
|
43
|
+
nodeNumber: 3,
|
|
44
|
+
nonce: 7,
|
|
45
|
+
...(geeqNorm === undefined ? {} : { geeqNorm }),
|
|
46
|
+
});
|
|
47
|
+
describe('the fee on a coin transfer', () => {
|
|
48
|
+
it('charges geeqNorm per signed byte, plus a quarter of a percent of the amount', async () => {
|
|
49
|
+
const tx = await createCoinTransferTx({
|
|
50
|
+
keypair: sender,
|
|
51
|
+
to: receiver.accountId,
|
|
52
|
+
amount: 10000n,
|
|
53
|
+
chainState: state(3n),
|
|
54
|
+
});
|
|
55
|
+
const bytes = signedUvtBytes(tx.transaction);
|
|
56
|
+
expect(tx.fee).toEqual({ total: BigInt(bytes) * 3n + 25n, data: BigInt(bytes) * 3n, coin: 25n, bytes });
|
|
57
|
+
});
|
|
58
|
+
it('rounds the coin part down, as the node divides', async () => {
|
|
59
|
+
const tx = await createCoinTransferTx({
|
|
60
|
+
keypair: sender,
|
|
61
|
+
to: receiver.accountId,
|
|
62
|
+
amount: 799n,
|
|
63
|
+
chainState: state(1n),
|
|
64
|
+
});
|
|
65
|
+
expect(tx.fee?.coin).toBe(1n);
|
|
66
|
+
});
|
|
67
|
+
it('caps the coin part at geeqNorm x 10^7', async () => {
|
|
68
|
+
const tx = await createCoinTransferTx({
|
|
69
|
+
keypair: sender,
|
|
70
|
+
to: receiver.accountId,
|
|
71
|
+
amount: 10n ** 12n,
|
|
72
|
+
chainState: state(2n),
|
|
73
|
+
});
|
|
74
|
+
expect(tx.fee?.coin).toBe(20000000n);
|
|
75
|
+
});
|
|
76
|
+
it('is undefined when the chain state has no geeqNorm to work it out from', async () => {
|
|
77
|
+
const tx = await createCoinTransferTx({
|
|
78
|
+
keypair: sender,
|
|
79
|
+
to: receiver.accountId,
|
|
80
|
+
amount: 150n,
|
|
81
|
+
...state(),
|
|
82
|
+
});
|
|
83
|
+
expect(tx.fee).toBeUndefined();
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe('the fee on the other transactions', () => {
|
|
87
|
+
it('charges an attestation for the transaction and the payload, and nothing on coin', async () => {
|
|
88
|
+
const tx = await createAttestationTx({
|
|
89
|
+
keypair: sender,
|
|
90
|
+
attestHash: ATTEST_HASH,
|
|
91
|
+
metadata: ['Invoice 41'],
|
|
92
|
+
chainState: state(2n),
|
|
93
|
+
});
|
|
94
|
+
const bytes = signedUatBytes(tx.transaction, tx.payload);
|
|
95
|
+
expect(tx.fee).toEqual({ total: BigInt(bytes) * 2n, data: BigInt(bytes) * 2n, coin: 0n, bytes });
|
|
96
|
+
});
|
|
97
|
+
it('charges a proxy creation on its funding, as a transfer on its amount', async () => {
|
|
98
|
+
const tx = await createNftMintProxyTx({
|
|
99
|
+
keypair: sender,
|
|
100
|
+
index: 1,
|
|
101
|
+
amount: 4000n,
|
|
102
|
+
chainState: state(1n),
|
|
103
|
+
});
|
|
104
|
+
const bytes = signedUvtBytes(tx.transaction);
|
|
105
|
+
expect(tx.fee).toEqual({ total: BigInt(bytes) + 10n, data: BigInt(bytes), coin: 10n, bytes });
|
|
106
|
+
});
|
|
107
|
+
it('charges an NFT mint on the payload too, and on the coin sent with it', async () => {
|
|
108
|
+
const tx = await createNftMintTx({
|
|
109
|
+
keypair: sender,
|
|
110
|
+
proxyAccountId: new Uint8Array(32).fill(9),
|
|
111
|
+
attestHash: ATTEST_HASH,
|
|
112
|
+
to: receiver.accountId,
|
|
113
|
+
amount: 800n,
|
|
114
|
+
chainState: state(1n),
|
|
115
|
+
});
|
|
116
|
+
const bytes = signedUatBytes(tx.transaction, tx.payload);
|
|
117
|
+
expect(tx.fee).toEqual({ total: BigInt(bytes) + 2n, data: BigInt(bytes), coin: 2n, bytes });
|
|
118
|
+
});
|
|
119
|
+
it('refuses a geeqNorm that is not a bigint', async () => {
|
|
120
|
+
await expect(createCoinTransferTx({
|
|
121
|
+
keypair: sender,
|
|
122
|
+
to: receiver.accountId,
|
|
123
|
+
amount: 150n,
|
|
124
|
+
chainState: { ...state(), geeqNorm: 1 },
|
|
125
|
+
})).rejects.toMatchObject({ code: 'invalid-argument' });
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe('geeqNorm in the ledger', () => {
|
|
129
|
+
const nodes = [{ ip: '10.0.0.1', nodeNumber: 3 }];
|
|
130
|
+
it('is read from the parameter list', () => {
|
|
131
|
+
expect(decodeValidationLedger(buildVll({ nodes, geeqNorm: 5n })).geeqNorm).toBe(5n);
|
|
132
|
+
});
|
|
133
|
+
it('is undefined when the chain does not publish it', () => {
|
|
134
|
+
expect(decodeValidationLedger(buildVll({ nodes, geeqNorm: null })).geeqNorm).toBeUndefined();
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('a chain checks the balance against the amount plus the fee', () => {
|
|
138
|
+
function connect(balance, overrides = {}) {
|
|
139
|
+
const body = vllResponse({
|
|
140
|
+
chainNumber: 1,
|
|
141
|
+
blockNumber: 41,
|
|
142
|
+
nodes: [{ ip: '10.0.0.1', nodeNumber: 3 }],
|
|
143
|
+
accounts: [{ accountId: sender.accountId, kind: 'asset', nonce: 7, balance }],
|
|
144
|
+
...overrides,
|
|
145
|
+
});
|
|
146
|
+
return GeeqChain.connect({ penniesPerGeeq: 1000000000n, endpoint: ENDPOINT, transport: fakeTransport(() => ({ body })) });
|
|
147
|
+
}
|
|
148
|
+
const send = (chain) => chain.createTransfer({ from: sender, to: receiver.accountId, amount: { pennies: 1000n } });
|
|
149
|
+
it('puts the fee on what it builds, from the geeqNorm it read', async () => {
|
|
150
|
+
const tx = await send(await connect(100000n));
|
|
151
|
+
expect(tx.fee?.total).toBe(BigInt(signedUvtBytes(tx.transaction)) + 2n);
|
|
152
|
+
expect(tx.chainState.geeqNorm).toBe(1n);
|
|
153
|
+
});
|
|
154
|
+
it('accepts a balance of exactly the amount plus the fee, and refuses a penny less', async () => {
|
|
155
|
+
const fee = (await send(await connect(100000n))).fee?.total;
|
|
156
|
+
await expect(send(await connect(1000n + fee))).resolves.toBeDefined();
|
|
157
|
+
const short = send(await connect(1000n + fee - 1n));
|
|
158
|
+
await expect(short).rejects.toMatchObject({ code: 'insufficient-funds' });
|
|
159
|
+
await expect(short).rejects.toThrow(/needs 0\.000001 plus a fee of/u);
|
|
160
|
+
});
|
|
161
|
+
it('refuses an attestation the account cannot pay the fee for', async () => {
|
|
162
|
+
const attempt = (await connect(10n)).createAttestation({ keypair: sender, content: 'a deed' });
|
|
163
|
+
await expect(attempt).rejects.toMatchObject({ code: 'insufficient-funds' });
|
|
164
|
+
await expect(attempt).rejects.toThrow(/needs a fee of/u);
|
|
165
|
+
});
|
|
166
|
+
it('does not spend the nonce on a transaction it refused', async () => {
|
|
167
|
+
const fee = (await send(await connect(100000n))).fee?.total;
|
|
168
|
+
const chain = await connect(1000n + fee - 1n);
|
|
169
|
+
await expect(send(chain)).rejects.toMatchObject({ code: 'insufficient-funds' });
|
|
170
|
+
// Not a nonce-collision: the refused build never claimed the nonce.
|
|
171
|
+
await expect(send(chain)).rejects.toMatchObject({ code: 'insufficient-funds' });
|
|
172
|
+
});
|
|
173
|
+
it('checks only the amount when the chain publishes no geeqNorm', async () => {
|
|
174
|
+
const chain = await connect(1000n, { geeqNorm: null, minTxAmt: null });
|
|
175
|
+
const tx = await send(chain);
|
|
176
|
+
expect(tx.fee).toBeUndefined();
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
//# sourceMappingURL=fee.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fee.test.js","sourceRoot":"","sources":["../../tests/fee.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { NetActorStatus, NetActorType } from '../../src/capnp/netActorRec.capnp';
|
|
2
|
+
/**
|
|
3
|
+
* Build a validation layer ledger for tests.
|
|
4
|
+
*
|
|
5
|
+
* A builder rather than a recorded blob on purpose: a captured `.b64` rots silently the
|
|
6
|
+
* day the schema moves, whereas this stops compiling. The trade is that it proves the
|
|
7
|
+
* SDK's logic, not that a real node's bytes parse — for that, capture one real response
|
|
8
|
+
* and add a golden test beside these.
|
|
9
|
+
*/
|
|
10
|
+
export interface FixtureNode {
|
|
11
|
+
readonly ip: string;
|
|
12
|
+
readonly port?: number;
|
|
13
|
+
readonly nodeNumber: number;
|
|
14
|
+
readonly type?: NetActorType;
|
|
15
|
+
readonly status?: NetActorStatus;
|
|
16
|
+
readonly sponsorNumber?: number;
|
|
17
|
+
/** `blockNumRemove`. Defaults to well clear of the ledger's block. */
|
|
18
|
+
readonly retiresAtBlock?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface FixtureAccount {
|
|
21
|
+
readonly accountId: Uint8Array;
|
|
22
|
+
/** `'asset-empty'` sets the ASSET tag but leaves the pointer null — the zero-value trap. */
|
|
23
|
+
readonly kind: 'asset' | 'hl' | 'micro' | 'asset-empty';
|
|
24
|
+
readonly nonce?: number;
|
|
25
|
+
/** Balance in pennies. Defaults to 1,000 geeq, enough that transfers are not the limit. */
|
|
26
|
+
readonly balance?: bigint;
|
|
27
|
+
/** NFT ids an asset record holds, in order. */
|
|
28
|
+
readonly nfts?: readonly (Uint8Array | {
|
|
29
|
+
readonly id: Uint8Array;
|
|
30
|
+
readonly counterparty: true;
|
|
31
|
+
})[];
|
|
32
|
+
}
|
|
33
|
+
export interface FixtureLedger {
|
|
34
|
+
readonly chainNumber?: number;
|
|
35
|
+
readonly blockNumber?: number;
|
|
36
|
+
readonly nodes?: readonly FixtureNode[];
|
|
37
|
+
readonly accounts?: readonly FixtureAccount[];
|
|
38
|
+
/** `null` omits the parameter entirely, so the limits come back undefined. */
|
|
39
|
+
readonly metadataVarNum?: number | null;
|
|
40
|
+
readonly metadataVarBytes?: number | null;
|
|
41
|
+
/** The two parameters a chain's minimum transfer is computed from. */
|
|
42
|
+
readonly minTxAmt?: bigint | null;
|
|
43
|
+
readonly geeqNorm?: bigint | null;
|
|
44
|
+
/** Omitted means no proxy list at all, as a ledger without proxies may carry. */
|
|
45
|
+
readonly proxies?: readonly FixtureProxy[];
|
|
46
|
+
}
|
|
47
|
+
export interface FixtureProxy {
|
|
48
|
+
readonly accountId: Uint8Array;
|
|
49
|
+
/** Defaults to `'nft-mint'`. */
|
|
50
|
+
readonly kind?: 'nft-mint' | 'funding';
|
|
51
|
+
/** The admin's account id, for an NFT mint proxy. */
|
|
52
|
+
readonly admin?: Uint8Array;
|
|
53
|
+
readonly nonce?: number;
|
|
54
|
+
readonly balance?: bigint;
|
|
55
|
+
}
|
|
56
|
+
export declare function buildVll(spec?: FixtureLedger): Uint8Array;
|
|
57
|
+
/** The same bytes as a node would serve them. */
|
|
58
|
+
export declare function vllBase64(spec?: FixtureLedger): string;
|
|
59
|
+
/** A whole `GET /api/blocks?type=vll` response body. */
|
|
60
|
+
export declare function vllResponse(spec?: FixtureLedger): string;
|
|
61
|
+
export interface FixtureNftRecord {
|
|
62
|
+
readonly id: Uint8Array;
|
|
63
|
+
readonly attestHash: Uint8Array;
|
|
64
|
+
readonly metadata?: readonly string[];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* A whole `GET /api/blocks?type=all` response body: an application layer ledger holding
|
|
68
|
+
* these NFT records, and an attestation-style record first so a reader has to skip it.
|
|
69
|
+
*/
|
|
70
|
+
export declare function allResponse(nfts?: readonly FixtureNftRecord[]): string;
|
|
71
|
+
export { NetActorStatus, NetActorType };
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { Message } from 'capnp-ts';
|
|
2
|
+
import { ValLayLedger } from '../../src/capnp/valLayLedger.capnp';
|
|
3
|
+
import { AppLayLedger } from '../../src/capnp/appLayLedger.capnp';
|
|
4
|
+
import { NetActorStatus, NetActorType, } from '../../src/capnp/netActorRec.capnp';
|
|
5
|
+
import { penniesToUint64 } from '../../src/amount';
|
|
6
|
+
export function buildVll(spec = {}) {
|
|
7
|
+
const message = new Message();
|
|
8
|
+
const vll = message.initRoot(ValLayLedger);
|
|
9
|
+
vll.setChainNum(spec.chainNumber ?? 1);
|
|
10
|
+
vll.setBlockNum(spec.blockNumber ?? 41);
|
|
11
|
+
const nodes = spec.nodes ?? [{ ip: '127.0.0.1', nodeNumber: 3 }];
|
|
12
|
+
const netActors = vll.initNetActorList().initNetActorRecs(nodes.length);
|
|
13
|
+
nodes.forEach((node, index) => {
|
|
14
|
+
const record = netActors.get(index);
|
|
15
|
+
record.setIpAddr(node.ip);
|
|
16
|
+
record.setPortNum(node.port ?? 2082);
|
|
17
|
+
record.setNodeNumSelf(node.nodeNumber);
|
|
18
|
+
record.setNodeNumSponsor(node.sponsorNumber ?? 99);
|
|
19
|
+
// Real ledgers set this 100–355 blocks ahead on promotion. The capnp zero value
|
|
20
|
+
// would read as "already rotating out", so every fixture node gets a real one.
|
|
21
|
+
record.setBlockNumRemove(node.retiresAtBlock ?? (spec.blockNumber ?? 41) + 200);
|
|
22
|
+
// Both are set explicitly on every node, always. The capnp zero values are
|
|
23
|
+
// ANCHOR_NODE + CHAIN_ADMIN, which is NOT processing-capable, so a forgotten setter
|
|
24
|
+
// would quietly build a node that can never be selected.
|
|
25
|
+
record.setNetActorType(node.type ?? NetActorType.NET_ACTOR_TYPE_ANON_NODE);
|
|
26
|
+
record.setRecStatus(node.status ?? NetActorStatus.NET_ACTOR_STATUS_NODE);
|
|
27
|
+
record.initAcctNumVal(32);
|
|
28
|
+
record.getAcctNumVal().copyBuffer(new Uint8Array(32).fill(0xa0 + index));
|
|
29
|
+
});
|
|
30
|
+
// Two shapes of parameter: the metadata ones are 16-bit counts, the transfer ones are
|
|
31
|
+
// 64-bit penny amounts. Building them separately keeps each loop honest about its type.
|
|
32
|
+
const counts = [];
|
|
33
|
+
if (spec.metadataVarNum !== null)
|
|
34
|
+
counts.push(['num', spec.metadataVarNum ?? 4]);
|
|
35
|
+
if (spec.metadataVarBytes !== null)
|
|
36
|
+
counts.push(['bytes', spec.metadataVarBytes ?? 64]);
|
|
37
|
+
const amounts = [];
|
|
38
|
+
if (spec.minTxAmt !== null)
|
|
39
|
+
amounts.push(['minTxAmt', spec.minTxAmt ?? 1n]);
|
|
40
|
+
if (spec.geeqNorm !== null)
|
|
41
|
+
amounts.push(['geeqNorm', spec.geeqNorm ?? 1n]);
|
|
42
|
+
const paramRecs = vll.initParamAcctList().initParamAcctRecs(counts.length + amounts.length);
|
|
43
|
+
counts.forEach(([kind, value], index) => {
|
|
44
|
+
const paramType = paramRecs.get(index).initParamType();
|
|
45
|
+
const slot = kind === 'num' ? paramType.initMetadataVarNum() : paramType.initMetadataVarBytes();
|
|
46
|
+
slot.setCurrentValue(value);
|
|
47
|
+
// Min and max are deliberately different from the current value, so a decoder that
|
|
48
|
+
// reads the wrong accessor fails the test instead of coincidentally passing.
|
|
49
|
+
slot.setMinimumValue(0);
|
|
50
|
+
slot.setMaximumValue(0xffff);
|
|
51
|
+
});
|
|
52
|
+
amounts.forEach(([kind, value], index) => {
|
|
53
|
+
const paramType = paramRecs.get(counts.length + index).initParamType();
|
|
54
|
+
const slot = kind === 'minTxAmt' ? paramType.initMinTxAmt() : paramType.initGeeqNorm();
|
|
55
|
+
slot.setCurrentValue(penniesToUint64(value));
|
|
56
|
+
});
|
|
57
|
+
const accounts = spec.accounts ?? [];
|
|
58
|
+
const coinAccounts = vll.initCoinAcctRecs(accounts.length);
|
|
59
|
+
accounts.forEach((account, index) => {
|
|
60
|
+
const record = coinAccounts.get(index);
|
|
61
|
+
record.initAcctNumVal(32);
|
|
62
|
+
record.getAcctNumVal().copyBuffer(account.accountId);
|
|
63
|
+
record.setAmtCoin(penniesToUint64(account.balance ?? 1000000000000n));
|
|
64
|
+
const recType = record.getRecType();
|
|
65
|
+
if (account.kind === 'asset') {
|
|
66
|
+
const asset = recType.initAsset();
|
|
67
|
+
asset.setNonce(account.nonce ?? 0);
|
|
68
|
+
const nfts = account.nfts ?? [];
|
|
69
|
+
const list = asset.initNftAssetSubgroups(nfts.length);
|
|
70
|
+
nfts.forEach((nft, position) => {
|
|
71
|
+
const id = nft instanceof Uint8Array ? nft : nft.id;
|
|
72
|
+
list.get(position).initAcctNumApp(32).copyBuffer(id);
|
|
73
|
+
list.get(position).setFlagCounterpartyNft(!(nft instanceof Uint8Array));
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else if (account.kind === 'hl')
|
|
77
|
+
recType.initHl();
|
|
78
|
+
else if (account.kind === 'micro')
|
|
79
|
+
recType.initMicro().setNonce(account.nonce ?? 0);
|
|
80
|
+
// 'asset-empty' writes nothing: the union keeps its ASSET zero tag with a null
|
|
81
|
+
// pointer, which is the case that makes a naive reader return nonce 0.
|
|
82
|
+
});
|
|
83
|
+
if (spec.proxies !== undefined) {
|
|
84
|
+
const proxyRecs = vll.initProxyAcctRecs(spec.proxies.length);
|
|
85
|
+
spec.proxies.forEach((proxy, index) => {
|
|
86
|
+
const record = proxyRecs.get(index);
|
|
87
|
+
record.initAcctNumVal(32);
|
|
88
|
+
record.getAcctNumVal().copyBuffer(proxy.accountId);
|
|
89
|
+
// A node starts every new proxy at 1.
|
|
90
|
+
record.setNonce(proxy.nonce ?? 1);
|
|
91
|
+
record.setAmtCoin(penniesToUint64(proxy.balance ?? 500n));
|
|
92
|
+
if (proxy.kind === 'funding') {
|
|
93
|
+
record.getRecType().initFunding();
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const nftMint = record.getRecType().initNftMint();
|
|
97
|
+
nftMint.initAcctNumAdminUser(32);
|
|
98
|
+
nftMint.getAcctNumAdminUser().copyBuffer(proxy.admin ?? new Uint8Array(32));
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return new Uint8Array(message.toPackedArrayBuffer());
|
|
103
|
+
}
|
|
104
|
+
/** The same bytes as a node would serve them. */
|
|
105
|
+
export function vllBase64(spec = {}) {
|
|
106
|
+
return Buffer.from(buildVll(spec)).toString('base64');
|
|
107
|
+
}
|
|
108
|
+
/** A whole `GET /api/blocks?type=vll` response body. */
|
|
109
|
+
export function vllResponse(spec = {}) {
|
|
110
|
+
return JSON.stringify({ result: vllBase64(spec) });
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* A whole `GET /api/blocks?type=all` response body: an application layer ledger holding
|
|
114
|
+
* these NFT records, and an attestation-style record first so a reader has to skip it.
|
|
115
|
+
*/
|
|
116
|
+
export function allResponse(nfts = []) {
|
|
117
|
+
const message = new Message();
|
|
118
|
+
const all = message.initRoot(AppLayLedger);
|
|
119
|
+
all.setChainNum(1);
|
|
120
|
+
all.setBlockNum(41);
|
|
121
|
+
const records = all.initAppLayRecs(nfts.length + 1);
|
|
122
|
+
records.get(0).getRecType().initStackable().initAttestationSubgroups(0);
|
|
123
|
+
records.get(0).initAcctNumApp(32).copyBuffer(new Uint8Array(32).fill(0xee));
|
|
124
|
+
nfts.forEach((nft, index) => {
|
|
125
|
+
const record = records.get(index + 1);
|
|
126
|
+
record.initAcctNumApp(32).copyBuffer(nft.id);
|
|
127
|
+
const data = record.getRecType().initNft().initAttestationSubgroup().initData();
|
|
128
|
+
data.initAttestHash(32).copyBuffer(nft.attestHash);
|
|
129
|
+
const labels = nft.metadata ?? [];
|
|
130
|
+
// Written in reverse with their positions, so a reader that ignores position fails.
|
|
131
|
+
const list = data.initMetadata(labels.length);
|
|
132
|
+
labels.forEach((label, position) => {
|
|
133
|
+
const entry = list.get(labels.length - 1 - position);
|
|
134
|
+
entry.setPosition(position + 1);
|
|
135
|
+
entry.initItem(Buffer.byteLength(label)).copyBuffer(new TextEncoder().encode(label));
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
return JSON.stringify({ result: Buffer.from(message.toPackedArrayBuffer()).toString('base64') });
|
|
139
|
+
}
|
|
140
|
+
export { NetActorStatus, NetActorType };
|
|
141
|
+
//# sourceMappingURL=build-vll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-vll.js","sourceRoot":"","sources":["../../../tests/fixtures/build-vll.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { GeeqWebSocketFactory, GeeqWebSocketLike, GeeqWebSocketMessageEvent } from '../../src/index';
|
|
2
|
+
/**
|
|
3
|
+
* A WebSocket driven by a script instead of a node.
|
|
4
|
+
*
|
|
5
|
+
* The SDK's socket type is a structural subset of the browser's, so this needs no library:
|
|
6
|
+
* it records what was sent and lets a test decide when the handshake completes, what the
|
|
7
|
+
* node says, and when the connection drops.
|
|
8
|
+
*/
|
|
9
|
+
export declare class FakeSocket implements GeeqWebSocketLike {
|
|
10
|
+
readonly url: string;
|
|
11
|
+
readyState: number;
|
|
12
|
+
readonly sent: string[];
|
|
13
|
+
private readonly listeners;
|
|
14
|
+
constructor(url: string);
|
|
15
|
+
addEventListener(type: 'open', listener: (event: unknown) => void): void;
|
|
16
|
+
addEventListener(type: 'message', listener: (event: GeeqWebSocketMessageEvent) => void): void;
|
|
17
|
+
addEventListener(type: 'close', listener: (event: unknown) => void): void;
|
|
18
|
+
addEventListener(type: 'error', listener: (event: unknown) => void): void;
|
|
19
|
+
send(data: string): void;
|
|
20
|
+
close(): void;
|
|
21
|
+
/** Complete the handshake. */
|
|
22
|
+
open(): void;
|
|
23
|
+
/** The node sends a frame. Objects are sent as JSON, strings as they are. */
|
|
24
|
+
receive(frame: unknown): void;
|
|
25
|
+
/** The connection is lost, as a proxy timeout or a node restart would lose it. */
|
|
26
|
+
drop(): void;
|
|
27
|
+
/** What the SDK sent, parsed, leaving out the keepalive. */
|
|
28
|
+
frames(): {
|
|
29
|
+
event: string;
|
|
30
|
+
payload?: unknown;
|
|
31
|
+
}[];
|
|
32
|
+
private fire;
|
|
33
|
+
}
|
|
34
|
+
export interface FakeSocketFactory extends GeeqWebSocketFactory {
|
|
35
|
+
readonly sockets: FakeSocket[];
|
|
36
|
+
/** The most recently opened connection. */
|
|
37
|
+
last(): FakeSocket;
|
|
38
|
+
}
|
|
39
|
+
export declare function fakeSocketFactory(): FakeSocketFactory;
|
|
40
|
+
/** A `uut_status` frame as a node sends it. */
|
|
41
|
+
export declare function uutStatus(refHash: string, status: 'nonsane' | 'incorrectlyIncluded' | 'invalid' | 'valid', extra?: Record<string, unknown>): {
|
|
42
|
+
event: 'uut_status';
|
|
43
|
+
payload: Record<string, unknown>;
|
|
44
|
+
};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A WebSocket driven by a script instead of a node.
|
|
3
|
+
*
|
|
4
|
+
* The SDK's socket type is a structural subset of the browser's, so this needs no library:
|
|
5
|
+
* it records what was sent and lets a test decide when the handshake completes, what the
|
|
6
|
+
* node says, and when the connection drops.
|
|
7
|
+
*/
|
|
8
|
+
export class FakeSocket {
|
|
9
|
+
constructor(url) {
|
|
10
|
+
this.url = url;
|
|
11
|
+
this.readyState = 0;
|
|
12
|
+
this.sent = [];
|
|
13
|
+
this.listeners = {
|
|
14
|
+
open: [],
|
|
15
|
+
message: [],
|
|
16
|
+
close: [],
|
|
17
|
+
error: [],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
addEventListener(type, listener) {
|
|
21
|
+
this.listeners[type].push(listener);
|
|
22
|
+
}
|
|
23
|
+
send(data) {
|
|
24
|
+
if (this.readyState !== 1)
|
|
25
|
+
throw new Error('InvalidStateError: the socket is not open');
|
|
26
|
+
this.sent.push(data);
|
|
27
|
+
}
|
|
28
|
+
close() {
|
|
29
|
+
if (this.readyState === 3)
|
|
30
|
+
return;
|
|
31
|
+
this.readyState = 3;
|
|
32
|
+
this.fire('close', { code: 1000 });
|
|
33
|
+
}
|
|
34
|
+
/** Complete the handshake. */
|
|
35
|
+
open() {
|
|
36
|
+
this.readyState = 1;
|
|
37
|
+
this.fire('open', {});
|
|
38
|
+
}
|
|
39
|
+
/** The node sends a frame. Objects are sent as JSON, strings as they are. */
|
|
40
|
+
receive(frame) {
|
|
41
|
+
this.fire('message', { data: typeof frame === 'string' ? frame : JSON.stringify(frame) });
|
|
42
|
+
}
|
|
43
|
+
/** The connection is lost, as a proxy timeout or a node restart would lose it. */
|
|
44
|
+
drop() {
|
|
45
|
+
this.readyState = 3;
|
|
46
|
+
this.fire('error', {});
|
|
47
|
+
this.fire('close', { code: 1006 });
|
|
48
|
+
}
|
|
49
|
+
/** What the SDK sent, parsed, leaving out the keepalive. */
|
|
50
|
+
frames() {
|
|
51
|
+
return this.sent.filter((frame) => frame !== 'ping').map((frame) => JSON.parse(frame));
|
|
52
|
+
}
|
|
53
|
+
fire(type, event) {
|
|
54
|
+
for (const listener of [...this.listeners[type]])
|
|
55
|
+
listener(event);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export function fakeSocketFactory() {
|
|
59
|
+
const sockets = [];
|
|
60
|
+
const factory = (url) => {
|
|
61
|
+
const socket = new FakeSocket(url);
|
|
62
|
+
sockets.push(socket);
|
|
63
|
+
return socket;
|
|
64
|
+
};
|
|
65
|
+
return Object.assign(factory, {
|
|
66
|
+
sockets,
|
|
67
|
+
last: () => {
|
|
68
|
+
const socket = sockets[sockets.length - 1];
|
|
69
|
+
if (socket === undefined)
|
|
70
|
+
throw new Error('no socket has been opened');
|
|
71
|
+
return socket;
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** A `uut_status` frame as a node sends it. */
|
|
76
|
+
export function uutStatus(refHash, status, extra = {}) {
|
|
77
|
+
return {
|
|
78
|
+
event: 'uut_status',
|
|
79
|
+
payload: {
|
|
80
|
+
refHash,
|
|
81
|
+
publicKeys: ['AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='],
|
|
82
|
+
blockNumber: 42,
|
|
83
|
+
vlbBlock: 43,
|
|
84
|
+
isValid: status === 'valid',
|
|
85
|
+
status,
|
|
86
|
+
error: status === 'valid' ? '' : `${status} because the test said so`,
|
|
87
|
+
type: 'outgoing',
|
|
88
|
+
createdAt: 'Date:Wed Sep 30 2026 10:00:00 GMT+0000 (Coordinated Universal Time)',
|
|
89
|
+
...extra,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=fake-socket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-socket.js","sourceRoot":"","sources":["../../../tests/fixtures/fake-socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { GeeqRequestInit, GeeqTransport } from '../../src/index';
|
|
2
|
+
export interface FakeReply {
|
|
3
|
+
readonly status?: number;
|
|
4
|
+
readonly body: string;
|
|
5
|
+
}
|
|
6
|
+
export interface FakeCall {
|
|
7
|
+
readonly url: string;
|
|
8
|
+
readonly init: GeeqRequestInit | undefined;
|
|
9
|
+
}
|
|
10
|
+
export type FakeHandler = (url: string, init: GeeqRequestInit | undefined, callIndex: number) => FakeReply | Error;
|
|
11
|
+
export interface FakeTransport extends GeeqTransport {
|
|
12
|
+
readonly calls: FakeCall[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* A transport driven by a script instead of a network.
|
|
16
|
+
*
|
|
17
|
+
* The SDK's transport type is a structural subset of `fetch`, so this needs no library
|
|
18
|
+
* and no live node — returning an object with `ok`, `status` and `text()` is enough.
|
|
19
|
+
* Throwing from the handler reproduces a transport failure, which is what a browser
|
|
20
|
+
* reports for CORS, TLS distrust, mixed content and an unreachable host alike.
|
|
21
|
+
*/
|
|
22
|
+
export declare function fakeTransport(script: FakeReply | Error | FakeHandler): FakeTransport;
|
|
23
|
+
/** A transport failure carrying a Node-style code, as undici and friends produce. */
|
|
24
|
+
export declare function networkError(code: string, message?: string): Error;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A transport driven by a script instead of a network.
|
|
3
|
+
*
|
|
4
|
+
* The SDK's transport type is a structural subset of `fetch`, so this needs no library
|
|
5
|
+
* and no live node — returning an object with `ok`, `status` and `text()` is enough.
|
|
6
|
+
* Throwing from the handler reproduces a transport failure, which is what a browser
|
|
7
|
+
* reports for CORS, TLS distrust, mixed content and an unreachable host alike.
|
|
8
|
+
*/
|
|
9
|
+
export function fakeTransport(script) {
|
|
10
|
+
const calls = [];
|
|
11
|
+
const transport = async (url, init) => {
|
|
12
|
+
const index = calls.length;
|
|
13
|
+
calls.push({ url, init });
|
|
14
|
+
const reply = typeof script === 'function' ? script(url, init, index) : script;
|
|
15
|
+
if (reply instanceof Error)
|
|
16
|
+
throw reply;
|
|
17
|
+
const status = reply.status ?? 200;
|
|
18
|
+
return {
|
|
19
|
+
ok: status >= 200 && status < 300,
|
|
20
|
+
status,
|
|
21
|
+
text: async () => reply.body,
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
return Object.assign(transport, { calls });
|
|
25
|
+
}
|
|
26
|
+
/** A transport failure carrying a Node-style code, as undici and friends produce. */
|
|
27
|
+
export function networkError(code, message = code) {
|
|
28
|
+
return Object.assign(new Error(message), { code });
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=fake-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-transport.js","sourceRoot":"","sources":["../../../tests/fixtures/fake-transport.ts"],"names":[],"mappings":"AAsBA;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,MAAuC;IACnE,MAAM,KAAK,GAAe,EAAE,CAAA;IAE5B,MAAM,SAAS,GAAG,KAAK,EAAE,GAAW,EAAE,IAAsB,EAAE,EAAE;QAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAA;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;QAEzB,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QAC9E,IAAI,KAAK,YAAY,KAAK;YAAE,MAAM,KAAK,CAAA;QAEvC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,CAAA;QAClC,OAAO;YACL,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;YACjC,MAAM;YACN,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI;SAC7B,CAAA;IACH,CAAC,CAAA;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;AAC5C,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAAO,GAAG,IAAI;IACvD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;AACpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|