@qubic.org/registry 0.2.6 → 1.0.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/LICENSE +41 -0
- package/README.md +1 -1
- package/data/epoch-refs.json +5 -1
- package/data/epochs/{205 → 214}/QVAULT.json +26 -3
- package/data/epochs/{192 → 215}/Qswap.json +16 -4
- package/data/epochs/{190 → 216}/QIP.json +63 -4
- package/data/epochs/217/Random.json +88 -0
- package/data/epochs/{204/QRaffle.json → 218/GGWP.json} +360 -324
- package/data/epochs/218/Random.json +88 -0
- package/data/registry.json +6506 -2824
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +5 -3
- package/dist/client.js.map +1 -1
- package/dist/payload.d.ts.map +1 -1
- package/dist/payload.js +18 -3
- package/dist/payload.js.map +1 -1
- package/package.json +5 -4
- package/src/__tests__/payload.test.ts +143 -0
- package/src/__tests__/registry.test.ts +199 -0
- package/src/client.ts +127 -0
- package/src/index.ts +4 -0
- package/src/payload.ts +433 -0
- package/src/registry.ts +204 -0
- package/src/types.ts +101 -0
- package/data/epochs/123/MyLastMatch.json +0 -10
- package/data/epochs/123/Quottery.json +0 -368
- package/data/epochs/123/Qx.json +0 -386
- package/data/epochs/123/Random.json +0 -33
- package/data/epochs/124/GeneralQuorumProposal.json +0 -318
- package/data/epochs/124/MyLastMatch.json +0 -10
- package/data/epochs/124/Quottery.json +0 -368
- package/data/epochs/124/Qx.json +0 -386
- package/data/epochs/124/Random.json +0 -33
- package/data/epochs/124/SupplyWatcher.json +0 -10
- package/data/epochs/125/GeneralQuorumProposal.json +0 -318
- package/data/epochs/125/MyLastMatch.json +0 -10
- package/data/epochs/125/Quottery.json +0 -368
- package/data/epochs/125/Qx.json +0 -386
- package/data/epochs/125/Random.json +0 -33
- package/data/epochs/125/SupplyWatcher.json +0 -10
- package/data/epochs/126/GeneralQuorumProposal.json +0 -318
- package/data/epochs/126/MyLastMatch.json +0 -10
- package/data/epochs/126/Quottery.json +0 -368
- package/data/epochs/126/Qx.json +0 -386
- package/data/epochs/126/Random.json +0 -33
- package/data/epochs/126/SupplyWatcher.json +0 -10
- package/data/epochs/127/GeneralQuorumProposal.json +0 -318
- package/data/epochs/127/MyLastMatch.json +0 -10
- package/data/epochs/127/Quottery.json +0 -368
- package/data/epochs/127/Qx.json +0 -386
- package/data/epochs/127/Random.json +0 -33
- package/data/epochs/127/SupplyWatcher.json +0 -10
- package/data/epochs/128/ComputorControlledFund.json +0 -334
- package/data/epochs/128/GeneralQuorumProposal.json +0 -318
- package/data/epochs/128/MyLastMatch.json +0 -10
- package/data/epochs/128/Quottery.json +0 -368
- package/data/epochs/128/Qx.json +0 -386
- package/data/epochs/128/Random.json +0 -33
- package/data/epochs/128/SupplyWatcher.json +0 -10
- package/data/epochs/129/ComputorControlledFund.json +0 -334
- package/data/epochs/129/GeneralQuorumProposal.json +0 -318
- package/data/epochs/129/MyLastMatch.json +0 -10
- package/data/epochs/129/Quottery.json +0 -368
- package/data/epochs/129/Qx.json +0 -386
- package/data/epochs/129/Random.json +0 -33
- package/data/epochs/129/SupplyWatcher.json +0 -10
- package/data/epochs/130/ComputorControlledFund.json +0 -334
- package/data/epochs/130/GeneralQuorumProposal.json +0 -318
- package/data/epochs/130/MyLastMatch.json +0 -10
- package/data/epochs/130/Quottery.json +0 -368
- package/data/epochs/130/Qx.json +0 -386
- package/data/epochs/130/Random.json +0 -33
- package/data/epochs/130/SupplyWatcher.json +0 -10
- package/data/epochs/131/ComputorControlledFund.json +0 -334
- package/data/epochs/131/GeneralQuorumProposal.json +0 -318
- package/data/epochs/131/MyLastMatch.json +0 -10
- package/data/epochs/131/Quottery.json +0 -368
- package/data/epochs/131/Qx.json +0 -386
- package/data/epochs/131/Random.json +0 -33
- package/data/epochs/131/SupplyWatcher.json +0 -10
- package/data/epochs/132/ComputorControlledFund.json +0 -334
- package/data/epochs/132/GeneralQuorumProposal.json +0 -318
- package/data/epochs/132/MyLastMatch.json +0 -10
- package/data/epochs/132/Quottery.json +0 -368
- package/data/epochs/132/Qx.json +0 -386
- package/data/epochs/132/Random.json +0 -33
- package/data/epochs/132/SupplyWatcher.json +0 -10
- package/data/epochs/133/ComputorControlledFund.json +0 -334
- package/data/epochs/133/GeneralQuorumProposal.json +0 -318
- package/data/epochs/133/MyLastMatch.json +0 -10
- package/data/epochs/133/Quottery.json +0 -368
- package/data/epochs/133/Qx.json +0 -386
- package/data/epochs/133/Random.json +0 -33
- package/data/epochs/133/SupplyWatcher.json +0 -10
- package/data/epochs/134/ComputorControlledFund.json +0 -334
- package/data/epochs/134/GeneralQuorumProposal.json +0 -318
- package/data/epochs/134/MyLastMatch.json +0 -10
- package/data/epochs/134/Quottery.json +0 -368
- package/data/epochs/134/Qx.json +0 -386
- package/data/epochs/134/Random.json +0 -33
- package/data/epochs/134/SupplyWatcher.json +0 -10
- package/data/epochs/135/ComputorControlledFund.json +0 -334
- package/data/epochs/135/GeneralQuorumProposal.json +0 -318
- package/data/epochs/135/MyLastMatch.json +0 -10
- package/data/epochs/135/Quottery.json +0 -368
- package/data/epochs/135/Qx.json +0 -386
- package/data/epochs/135/Random.json +0 -33
- package/data/epochs/135/SupplyWatcher.json +0 -10
- package/data/epochs/136/ComputorControlledFund.json +0 -334
- package/data/epochs/136/GeneralQuorumProposal.json +0 -318
- package/data/epochs/136/MyLastMatch.json +0 -10
- package/data/epochs/136/Quottery.json +0 -368
- package/data/epochs/136/Qx.json +0 -386
- package/data/epochs/136/Random.json +0 -33
- package/data/epochs/136/SupplyWatcher.json +0 -10
- package/data/epochs/137/ComputorControlledFund.json +0 -334
- package/data/epochs/137/GeneralQuorumProposal.json +0 -318
- package/data/epochs/137/MyLastMatch.json +0 -10
- package/data/epochs/137/Quottery.json +0 -368
- package/data/epochs/137/Qx.json +0 -386
- package/data/epochs/137/Random.json +0 -33
- package/data/epochs/137/SupplyWatcher.json +0 -10
- package/data/epochs/138/ComputorControlledFund.json +0 -334
- package/data/epochs/138/GeneralQuorumProposal.json +0 -318
- package/data/epochs/138/MyLastMatch.json +0 -10
- package/data/epochs/138/Qearn.json +0 -220
- package/data/epochs/138/Quottery.json +0 -368
- package/data/epochs/138/Qx.json +0 -386
- package/data/epochs/138/Random.json +0 -33
- package/data/epochs/138/SupplyWatcher.json +0 -10
- package/data/epochs/139/ComputorControlledFund.json +0 -334
- package/data/epochs/139/GeneralQuorumProposal.json +0 -318
- package/data/epochs/139/MyLastMatch.json +0 -10
- package/data/epochs/139/QVAULT.json +0 -286
- package/data/epochs/139/Qearn.json +0 -220
- package/data/epochs/139/Quottery.json +0 -368
- package/data/epochs/139/Qx.json +0 -386
- package/data/epochs/139/Random.json +0 -33
- package/data/epochs/139/SupplyWatcher.json +0 -10
- package/data/epochs/140/ComputorControlledFund.json +0 -334
- package/data/epochs/140/GeneralQuorumProposal.json +0 -318
- package/data/epochs/140/MyLastMatch.json +0 -10
- package/data/epochs/140/QVAULT.json +0 -286
- package/data/epochs/140/Quottery.json +0 -368
- package/data/epochs/140/Qx.json +0 -386
- package/data/epochs/140/Random.json +0 -33
- package/data/epochs/140/SupplyWatcher.json +0 -10
- package/data/epochs/141/ComputorControlledFund.json +0 -334
- package/data/epochs/141/GeneralQuorumProposal.json +0 -318
- package/data/epochs/141/MyLastMatch.json +0 -10
- package/data/epochs/141/QVAULT.json +0 -286
- package/data/epochs/141/Qearn.json +0 -261
- package/data/epochs/141/Quottery.json +0 -368
- package/data/epochs/141/Qx.json +0 -386
- package/data/epochs/141/Random.json +0 -33
- package/data/epochs/141/SupplyWatcher.json +0 -10
- package/data/epochs/142/ComputorControlledFund.json +0 -334
- package/data/epochs/142/GeneralQuorumProposal.json +0 -318
- package/data/epochs/142/MyLastMatch.json +0 -10
- package/data/epochs/142/QVAULT.json +0 -286
- package/data/epochs/142/Qearn.json +0 -261
- package/data/epochs/142/Quottery.json +0 -368
- package/data/epochs/142/Qx.json +0 -386
- package/data/epochs/142/Random.json +0 -33
- package/data/epochs/142/SupplyWatcher.json +0 -10
- package/data/epochs/143/ComputorControlledFund.json +0 -334
- package/data/epochs/143/GeneralQuorumProposal.json +0 -318
- package/data/epochs/143/MyLastMatch.json +0 -10
- package/data/epochs/143/QVAULT.json +0 -286
- package/data/epochs/143/Qearn.json +0 -261
- package/data/epochs/143/Quottery.json +0 -368
- package/data/epochs/143/Qx.json +0 -386
- package/data/epochs/143/Random.json +0 -33
- package/data/epochs/143/SupplyWatcher.json +0 -10
- package/data/epochs/144/MyLastMatch.json +0 -10
- package/data/epochs/144/QVAULT.json +0 -286
- package/data/epochs/144/Random.json +0 -33
- package/data/epochs/144/SupplyWatcher.json +0 -10
- package/data/epochs/145/ComputorControlledFund.json +0 -392
- package/data/epochs/145/GeneralQuorumProposal.json +0 -361
- package/data/epochs/145/MyLastMatch.json +0 -10
- package/data/epochs/145/QVAULT.json +0 -286
- package/data/epochs/145/Qearn.json +0 -360
- package/data/epochs/145/Quottery.json +0 -396
- package/data/epochs/145/Qx.json +0 -451
- package/data/epochs/145/Random.json +0 -33
- package/data/epochs/145/SupplyWatcher.json +0 -10
- package/data/epochs/146/ComputorControlledFund.json +0 -392
- package/data/epochs/146/GeneralQuorumProposal.json +0 -361
- package/data/epochs/146/MyLastMatch.json +0 -10
- package/data/epochs/146/QVAULT.json +0 -286
- package/data/epochs/146/Qearn.json +0 -360
- package/data/epochs/146/Quottery.json +0 -396
- package/data/epochs/146/Random.json +0 -33
- package/data/epochs/146/SupplyWatcher.json +0 -10
- package/data/epochs/147/ComputorControlledFund.json +0 -392
- package/data/epochs/147/GeneralQuorumProposal.json +0 -361
- package/data/epochs/147/MyLastMatch.json +0 -10
- package/data/epochs/147/QVAULT.json +0 -286
- package/data/epochs/147/Qearn.json +0 -360
- package/data/epochs/147/Quottery.json +0 -396
- package/data/epochs/147/Qx.json +0 -505
- package/data/epochs/147/Random.json +0 -33
- package/data/epochs/147/SupplyWatcher.json +0 -10
- package/data/epochs/148/ComputorControlledFund.json +0 -392
- package/data/epochs/148/GeneralQuorumProposal.json +0 -361
- package/data/epochs/148/MyLastMatch.json +0 -10
- package/data/epochs/148/QVAULT.json +0 -286
- package/data/epochs/148/Qearn.json +0 -360
- package/data/epochs/148/Quottery.json +0 -396
- package/data/epochs/148/Qx.json +0 -505
- package/data/epochs/148/Random.json +0 -33
- package/data/epochs/148/SupplyWatcher.json +0 -10
- package/data/epochs/149/ComputorControlledFund.json +0 -392
- package/data/epochs/149/GeneralQuorumProposal.json +0 -361
- package/data/epochs/149/MyLastMatch.json +0 -10
- package/data/epochs/149/QUtil.json +0 -121
- package/data/epochs/149/QVAULT.json +0 -286
- package/data/epochs/149/Qearn.json +0 -360
- package/data/epochs/149/Quottery.json +0 -396
- package/data/epochs/149/Qx.json +0 -505
- package/data/epochs/149/Random.json +0 -33
- package/data/epochs/149/SupplyWatcher.json +0 -10
- package/data/epochs/150/ComputorControlledFund.json +0 -392
- package/data/epochs/150/GeneralQuorumProposal.json +0 -361
- package/data/epochs/150/MsVault.json +0 -436
- package/data/epochs/150/MyLastMatch.json +0 -10
- package/data/epochs/150/QUtil.json +0 -121
- package/data/epochs/150/QVAULT.json +0 -286
- package/data/epochs/150/Qearn.json +0 -360
- package/data/epochs/150/Quottery.json +0 -396
- package/data/epochs/150/Qx.json +0 -505
- package/data/epochs/150/Random.json +0 -33
- package/data/epochs/150/SupplyWatcher.json +0 -10
- package/data/epochs/151/ComputorControlledFund.json +0 -392
- package/data/epochs/151/GeneralQuorumProposal.json +0 -361
- package/data/epochs/151/MsVault.json +0 -436
- package/data/epochs/151/MyLastMatch.json +0 -10
- package/data/epochs/151/QUtil.json +0 -121
- package/data/epochs/151/QVAULT.json +0 -286
- package/data/epochs/151/Qearn.json +0 -360
- package/data/epochs/151/Quottery.json +0 -396
- package/data/epochs/151/Qx.json +0 -505
- package/data/epochs/151/Random.json +0 -33
- package/data/epochs/151/SupplyWatcher.json +0 -10
- package/data/epochs/152/ComputorControlledFund.json +0 -392
- package/data/epochs/152/GeneralQuorumProposal.json +0 -361
- package/data/epochs/152/MsVault.json +0 -436
- package/data/epochs/152/MyLastMatch.json +0 -10
- package/data/epochs/152/QUtil.json +0 -121
- package/data/epochs/152/QVAULT.json +0 -286
- package/data/epochs/152/Qearn.json +0 -360
- package/data/epochs/152/Quottery.json +0 -396
- package/data/epochs/152/Qx.json +0 -505
- package/data/epochs/152/Random.json +0 -33
- package/data/epochs/152/SupplyWatcher.json +0 -10
- package/data/epochs/153/ComputorControlledFund.json +0 -392
- package/data/epochs/153/GeneralQuorumProposal.json +0 -361
- package/data/epochs/153/MsVault.json +0 -436
- package/data/epochs/153/MyLastMatch.json +0 -10
- package/data/epochs/153/QUtil.json +0 -121
- package/data/epochs/153/QVAULT.json +0 -286
- package/data/epochs/153/Qearn.json +0 -360
- package/data/epochs/153/Quottery.json +0 -396
- package/data/epochs/153/Qx.json +0 -505
- package/data/epochs/153/Random.json +0 -33
- package/data/epochs/153/SupplyWatcher.json +0 -10
- package/data/epochs/154/ComputorControlledFund.json +0 -392
- package/data/epochs/154/GeneralQuorumProposal.json +0 -361
- package/data/epochs/154/MsVault.json +0 -436
- package/data/epochs/154/MyLastMatch.json +0 -10
- package/data/epochs/154/QUtil.json +0 -121
- package/data/epochs/154/QVAULT.json +0 -286
- package/data/epochs/154/Qearn.json +0 -360
- package/data/epochs/154/Quottery.json +0 -396
- package/data/epochs/154/Qx.json +0 -505
- package/data/epochs/154/Random.json +0 -33
- package/data/epochs/154/SupplyWatcher.json +0 -10
- package/data/epochs/155/ComputorControlledFund.json +0 -392
- package/data/epochs/155/GeneralQuorumProposal.json +0 -361
- package/data/epochs/155/MsVault.json +0 -436
- package/data/epochs/155/MyLastMatch.json +0 -10
- package/data/epochs/155/QUtil.json +0 -121
- package/data/epochs/155/QVAULT.json +0 -286
- package/data/epochs/155/Qbay.json +0 -1325
- package/data/epochs/155/Qearn.json +0 -360
- package/data/epochs/155/Quottery.json +0 -396
- package/data/epochs/155/Qx.json +0 -505
- package/data/epochs/155/Random.json +0 -33
- package/data/epochs/155/SupplyWatcher.json +0 -10
- package/data/epochs/156/MsVault.json +0 -436
- package/data/epochs/156/MyLastMatch.json +0 -10
- package/data/epochs/156/QUtil.json +0 -121
- package/data/epochs/156/QVAULT.json +0 -286
- package/data/epochs/156/Qbay.json +0 -1325
- package/data/epochs/156/Qearn.json +0 -360
- package/data/epochs/156/Quottery.json +0 -396
- package/data/epochs/156/Qx.json +0 -505
- package/data/epochs/156/Random.json +0 -33
- package/data/epochs/156/SupplyWatcher.json +0 -10
- package/data/epochs/157/ComputorControlledFund.json +0 -432
- package/data/epochs/157/GeneralQuorumProposal.json +0 -401
- package/data/epochs/157/MsVault.json +0 -436
- package/data/epochs/157/MyLastMatch.json +0 -10
- package/data/epochs/157/QUtil.json +0 -121
- package/data/epochs/157/QVAULT.json +0 -286
- package/data/epochs/157/Qbay.json +0 -1325
- package/data/epochs/157/Qearn.json +0 -360
- package/data/epochs/157/Quottery.json +0 -396
- package/data/epochs/157/Qx.json +0 -505
- package/data/epochs/157/Random.json +0 -33
- package/data/epochs/157/SupplyWatcher.json +0 -10
- package/data/epochs/158/ComputorControlledFund.json +0 -432
- package/data/epochs/158/GeneralQuorumProposal.json +0 -401
- package/data/epochs/158/MsVault.json +0 -436
- package/data/epochs/158/MyLastMatch.json +0 -10
- package/data/epochs/158/QUtil.json +0 -121
- package/data/epochs/158/QVAULT.json +0 -286
- package/data/epochs/158/Qbay.json +0 -1325
- package/data/epochs/158/Qearn.json +0 -360
- package/data/epochs/158/Quottery.json +0 -396
- package/data/epochs/158/Qx.json +0 -505
- package/data/epochs/158/Random.json +0 -33
- package/data/epochs/158/SupplyWatcher.json +0 -10
- package/data/epochs/159/ComputorControlledFund.json +0 -432
- package/data/epochs/159/GeneralQuorumProposal.json +0 -401
- package/data/epochs/159/MsVault.json +0 -436
- package/data/epochs/159/MyLastMatch.json +0 -10
- package/data/epochs/159/QUtil.json +0 -121
- package/data/epochs/159/QVAULT.json +0 -286
- package/data/epochs/159/Qbay.json +0 -1325
- package/data/epochs/159/Qearn.json +0 -360
- package/data/epochs/159/Quottery.json +0 -396
- package/data/epochs/159/Qx.json +0 -505
- package/data/epochs/159/Random.json +0 -33
- package/data/epochs/159/SupplyWatcher.json +0 -10
- package/data/epochs/160/ComputorControlledFund.json +0 -432
- package/data/epochs/160/GeneralQuorumProposal.json +0 -401
- package/data/epochs/160/MsVault.json +0 -436
- package/data/epochs/160/MyLastMatch.json +0 -10
- package/data/epochs/160/QUtil.json +0 -121
- package/data/epochs/160/QVAULT.json +0 -286
- package/data/epochs/160/Qbay.json +0 -1325
- package/data/epochs/160/Qearn.json +0 -360
- package/data/epochs/160/Quottery.json +0 -396
- package/data/epochs/160/Qx.json +0 -505
- package/data/epochs/160/Random.json +0 -33
- package/data/epochs/160/SupplyWatcher.json +0 -10
- package/data/epochs/161/ComputorControlledFund.json +0 -432
- package/data/epochs/161/GeneralQuorumProposal.json +0 -401
- package/data/epochs/161/MsVault.json +0 -436
- package/data/epochs/161/MyLastMatch.json +0 -10
- package/data/epochs/161/QUtil.json +0 -121
- package/data/epochs/161/QVAULT.json +0 -286
- package/data/epochs/161/Qbay.json +0 -1325
- package/data/epochs/161/Qearn.json +0 -360
- package/data/epochs/161/Quottery.json +0 -396
- package/data/epochs/161/Qx.json +0 -505
- package/data/epochs/161/Random.json +0 -33
- package/data/epochs/161/SupplyWatcher.json +0 -10
- package/data/epochs/162/ComputorControlledFund.json +0 -432
- package/data/epochs/162/GeneralQuorumProposal.json +0 -401
- package/data/epochs/162/MsVault.json +0 -436
- package/data/epochs/162/MyLastMatch.json +0 -10
- package/data/epochs/162/QUtil.json +0 -121
- package/data/epochs/162/QVAULT.json +0 -286
- package/data/epochs/162/Qbay.json +0 -1325
- package/data/epochs/162/Qearn.json +0 -360
- package/data/epochs/162/Quottery.json +0 -396
- package/data/epochs/162/Qx.json +0 -505
- package/data/epochs/162/Random.json +0 -33
- package/data/epochs/162/SupplyWatcher.json +0 -10
- package/data/epochs/163/ComputorControlledFund.json +0 -432
- package/data/epochs/163/GeneralQuorumProposal.json +0 -401
- package/data/epochs/163/MsVault.json +0 -436
- package/data/epochs/163/MyLastMatch.json +0 -10
- package/data/epochs/163/QVAULT.json +0 -286
- package/data/epochs/163/Qbay.json +0 -1325
- package/data/epochs/163/Qearn.json +0 -360
- package/data/epochs/163/Quottery.json +0 -396
- package/data/epochs/163/Qx.json +0 -505
- package/data/epochs/163/Random.json +0 -33
- package/data/epochs/163/SupplyWatcher.json +0 -10
- package/data/epochs/164/ComputorControlledFund.json +0 -432
- package/data/epochs/164/GeneralQuorumProposal.json +0 -401
- package/data/epochs/164/MsVault.json +0 -436
- package/data/epochs/164/MyLastMatch.json +0 -10
- package/data/epochs/164/QUtil.json +0 -150
- package/data/epochs/164/QVAULT.json +0 -286
- package/data/epochs/164/Qbay.json +0 -1325
- package/data/epochs/164/Qearn.json +0 -360
- package/data/epochs/164/Quottery.json +0 -396
- package/data/epochs/164/Qx.json +0 -505
- package/data/epochs/164/Random.json +0 -33
- package/data/epochs/164/SupplyWatcher.json +0 -10
- package/data/epochs/165/ComputorControlledFund.json +0 -432
- package/data/epochs/165/GeneralQuorumProposal.json +0 -401
- package/data/epochs/165/MsVault.json +0 -436
- package/data/epochs/165/MyLastMatch.json +0 -10
- package/data/epochs/165/QUtil.json +0 -150
- package/data/epochs/165/QVAULT.json +0 -286
- package/data/epochs/165/Qbay.json +0 -1325
- package/data/epochs/165/Qearn.json +0 -360
- package/data/epochs/165/Quottery.json +0 -396
- package/data/epochs/165/Qx.json +0 -505
- package/data/epochs/165/Random.json +0 -33
- package/data/epochs/165/SupplyWatcher.json +0 -10
- package/data/epochs/166/ComputorControlledFund.json +0 -432
- package/data/epochs/166/GeneralQuorumProposal.json +0 -401
- package/data/epochs/166/MsVault.json +0 -436
- package/data/epochs/166/MyLastMatch.json +0 -10
- package/data/epochs/166/QUtil.json +0 -150
- package/data/epochs/166/QVAULT.json +0 -286
- package/data/epochs/166/Qbay.json +0 -1325
- package/data/epochs/166/Qearn.json +0 -360
- package/data/epochs/166/Quottery.json +0 -396
- package/data/epochs/166/Qx.json +0 -505
- package/data/epochs/166/Random.json +0 -33
- package/data/epochs/166/SupplyWatcher.json +0 -10
- package/data/epochs/167/ComputorControlledFund.json +0 -432
- package/data/epochs/167/GeneralQuorumProposal.json +0 -401
- package/data/epochs/167/MsVault.json +0 -436
- package/data/epochs/167/MyLastMatch.json +0 -10
- package/data/epochs/167/QUtil.json +0 -150
- package/data/epochs/167/QVAULT.json +0 -286
- package/data/epochs/167/Qbay.json +0 -1325
- package/data/epochs/167/Qearn.json +0 -360
- package/data/epochs/167/Quottery.json +0 -396
- package/data/epochs/167/Qx.json +0 -505
- package/data/epochs/167/Random.json +0 -33
- package/data/epochs/167/SupplyWatcher.json +0 -10
- package/data/epochs/168/ComputorControlledFund.json +0 -432
- package/data/epochs/168/MsVault.json +0 -436
- package/data/epochs/168/MyLastMatch.json +0 -10
- package/data/epochs/168/QVAULT.json +0 -286
- package/data/epochs/168/Qbay.json +0 -1325
- package/data/epochs/168/Qearn.json +0 -360
- package/data/epochs/168/Quottery.json +0 -396
- package/data/epochs/168/Qx.json +0 -505
- package/data/epochs/168/Random.json +0 -33
- package/data/epochs/168/SupplyWatcher.json +0 -10
- package/data/epochs/169/ComputorControlledFund.json +0 -432
- package/data/epochs/169/GeneralQuorumProposal.json +0 -407
- package/data/epochs/169/MsVault.json +0 -436
- package/data/epochs/169/MyLastMatch.json +0 -10
- package/data/epochs/169/QUtil.json +0 -486
- package/data/epochs/169/QVAULT.json +0 -286
- package/data/epochs/169/Qbay.json +0 -1325
- package/data/epochs/169/Qearn.json +0 -360
- package/data/epochs/169/Quottery.json +0 -396
- package/data/epochs/169/Qx.json +0 -505
- package/data/epochs/169/Random.json +0 -33
- package/data/epochs/169/SupplyWatcher.json +0 -10
- package/data/epochs/170/ComputorControlledFund.json +0 -432
- package/data/epochs/170/GeneralQuorumProposal.json +0 -407
- package/data/epochs/170/MsVault.json +0 -436
- package/data/epochs/170/MyLastMatch.json +0 -10
- package/data/epochs/170/QUtil.json +0 -486
- package/data/epochs/170/QVAULT.json +0 -286
- package/data/epochs/170/Qbay.json +0 -1325
- package/data/epochs/170/Qearn.json +0 -360
- package/data/epochs/170/Quottery.json +0 -396
- package/data/epochs/170/Qx.json +0 -505
- package/data/epochs/170/Random.json +0 -33
- package/data/epochs/170/SupplyWatcher.json +0 -10
- package/data/epochs/171/ComputorControlledFund.json +0 -432
- package/data/epochs/171/GeneralQuorumProposal.json +0 -407
- package/data/epochs/171/MsVault.json +0 -436
- package/data/epochs/171/MyLastMatch.json +0 -10
- package/data/epochs/171/QUtil.json +0 -486
- package/data/epochs/171/QVAULT.json +0 -286
- package/data/epochs/171/Qbay.json +0 -1325
- package/data/epochs/171/Qearn.json +0 -360
- package/data/epochs/171/Quottery.json +0 -396
- package/data/epochs/171/Qx.json +0 -505
- package/data/epochs/171/Random.json +0 -33
- package/data/epochs/171/SupplyWatcher.json +0 -10
- package/data/epochs/172/ComputorControlledFund.json +0 -432
- package/data/epochs/172/GeneralQuorumProposal.json +0 -407
- package/data/epochs/172/MsVault.json +0 -436
- package/data/epochs/172/MyLastMatch.json +0 -10
- package/data/epochs/172/QUtil.json +0 -486
- package/data/epochs/172/QVAULT.json +0 -286
- package/data/epochs/172/Qbay.json +0 -1325
- package/data/epochs/172/Qearn.json +0 -360
- package/data/epochs/172/Qswap.json +0 -700
- package/data/epochs/172/Quottery.json +0 -396
- package/data/epochs/172/Qx.json +0 -505
- package/data/epochs/172/Random.json +0 -33
- package/data/epochs/172/SupplyWatcher.json +0 -10
- package/data/epochs/173/ComputorControlledFund.json +0 -432
- package/data/epochs/173/GeneralQuorumProposal.json +0 -407
- package/data/epochs/173/MsVault.json +0 -436
- package/data/epochs/173/MyLastMatch.json +0 -10
- package/data/epochs/173/Nostromo.json +0 -978
- package/data/epochs/173/QUtil.json +0 -486
- package/data/epochs/173/QVAULT.json +0 -286
- package/data/epochs/173/Qbay.json +0 -1325
- package/data/epochs/173/Qearn.json +0 -360
- package/data/epochs/173/Qswap.json +0 -700
- package/data/epochs/173/Quottery.json +0 -396
- package/data/epochs/173/Qx.json +0 -505
- package/data/epochs/173/Random.json +0 -33
- package/data/epochs/173/SupplyWatcher.json +0 -10
- package/data/epochs/174/ComputorControlledFund.json +0 -432
- package/data/epochs/174/GeneralQuorumProposal.json +0 -407
- package/data/epochs/174/MsVault.json +0 -436
- package/data/epochs/174/MyLastMatch.json +0 -10
- package/data/epochs/174/Nostromo.json +0 -978
- package/data/epochs/174/QUtil.json +0 -486
- package/data/epochs/174/QVAULT.json +0 -286
- package/data/epochs/174/Qbay.json +0 -1325
- package/data/epochs/174/Qearn.json +0 -360
- package/data/epochs/174/Qswap.json +0 -700
- package/data/epochs/174/Quottery.json +0 -396
- package/data/epochs/174/Qx.json +0 -505
- package/data/epochs/174/Random.json +0 -33
- package/data/epochs/174/SupplyWatcher.json +0 -10
- package/data/epochs/175/ComputorControlledFund.json +0 -432
- package/data/epochs/175/GeneralQuorumProposal.json +0 -407
- package/data/epochs/175/MsVault.json +0 -436
- package/data/epochs/175/MyLastMatch.json +0 -10
- package/data/epochs/175/Nostromo.json +0 -978
- package/data/epochs/175/QUtil.json +0 -486
- package/data/epochs/175/QVAULT.json +0 -286
- package/data/epochs/175/Qbay.json +0 -1325
- package/data/epochs/175/Qearn.json +0 -360
- package/data/epochs/175/Quottery.json +0 -396
- package/data/epochs/175/Qx.json +0 -505
- package/data/epochs/175/Random.json +0 -33
- package/data/epochs/175/SupplyWatcher.json +0 -10
- package/data/epochs/176/MsVault.json +0 -436
- package/data/epochs/176/MyLastMatch.json +0 -10
- package/data/epochs/176/Nostromo.json +0 -978
- package/data/epochs/176/QVAULT.json +0 -286
- package/data/epochs/176/Qbay.json +0 -1325
- package/data/epochs/176/Qearn.json +0 -360
- package/data/epochs/176/Qswap.json +0 -700
- package/data/epochs/176/Quottery.json +0 -396
- package/data/epochs/176/Qx.json +0 -505
- package/data/epochs/176/Random.json +0 -33
- package/data/epochs/176/SupplyWatcher.json +0 -10
- package/data/epochs/177/ComputorControlledFund.json +0 -453
- package/data/epochs/177/GeneralQuorumProposal.json +0 -428
- package/data/epochs/177/MsVault.json +0 -436
- package/data/epochs/177/MyLastMatch.json +0 -10
- package/data/epochs/177/Nostromo.json +0 -978
- package/data/epochs/177/QUtil.json +0 -486
- package/data/epochs/177/QVAULT.json +0 -286
- package/data/epochs/177/Qbay.json +0 -1325
- package/data/epochs/177/Qearn.json +0 -360
- package/data/epochs/177/Qswap.json +0 -700
- package/data/epochs/177/Quottery.json +0 -396
- package/data/epochs/177/Qx.json +0 -505
- package/data/epochs/177/Random.json +0 -33
- package/data/epochs/177/SupplyWatcher.json +0 -10
- package/data/epochs/178/ComputorControlledFund.json +0 -453
- package/data/epochs/178/GeneralQuorumProposal.json +0 -428
- package/data/epochs/178/MsVault.json +0 -436
- package/data/epochs/178/MyLastMatch.json +0 -10
- package/data/epochs/178/Nostromo.json +0 -978
- package/data/epochs/178/QUtil.json +0 -486
- package/data/epochs/178/QVAULT.json +0 -286
- package/data/epochs/178/Qbay.json +0 -1325
- package/data/epochs/178/Qearn.json +0 -360
- package/data/epochs/178/Qswap.json +0 -700
- package/data/epochs/178/Quottery.json +0 -396
- package/data/epochs/178/Qx.json +0 -505
- package/data/epochs/178/Random.json +0 -33
- package/data/epochs/178/SupplyWatcher.json +0 -10
- package/data/epochs/179/ComputorControlledFund.json +0 -453
- package/data/epochs/179/GeneralQuorumProposal.json +0 -428
- package/data/epochs/179/MsVault.json +0 -436
- package/data/epochs/179/MyLastMatch.json +0 -10
- package/data/epochs/179/Nostromo.json +0 -978
- package/data/epochs/179/QVAULT.json +0 -286
- package/data/epochs/179/Qbay.json +0 -1325
- package/data/epochs/179/Qearn.json +0 -360
- package/data/epochs/179/Qswap.json +0 -700
- package/data/epochs/179/Quottery.json +0 -396
- package/data/epochs/179/Qx.json +0 -505
- package/data/epochs/179/Random.json +0 -33
- package/data/epochs/179/SupplyWatcher.json +0 -10
- package/data/epochs/180/ComputorControlledFund.json +0 -453
- package/data/epochs/180/GeneralQuorumProposal.json +0 -428
- package/data/epochs/180/MsVault.json +0 -436
- package/data/epochs/180/MyLastMatch.json +0 -10
- package/data/epochs/180/Nostromo.json +0 -978
- package/data/epochs/180/QUtil.json +0 -528
- package/data/epochs/180/QVAULT.json +0 -286
- package/data/epochs/180/Qbay.json +0 -1325
- package/data/epochs/180/Qdraw.json +0 -120
- package/data/epochs/180/Qearn.json +0 -360
- package/data/epochs/180/Quottery.json +0 -396
- package/data/epochs/180/Qx.json +0 -505
- package/data/epochs/180/Random.json +0 -33
- package/data/epochs/180/SupplyWatcher.json +0 -10
- package/data/epochs/181/ComputorControlledFund.json +0 -453
- package/data/epochs/181/GeneralQuorumProposal.json +0 -428
- package/data/epochs/181/MyLastMatch.json +0 -10
- package/data/epochs/181/Nostromo.json +0 -978
- package/data/epochs/181/QUtil.json +0 -528
- package/data/epochs/181/QVAULT.json +0 -286
- package/data/epochs/181/Qbay.json +0 -1325
- package/data/epochs/181/Qdraw.json +0 -120
- package/data/epochs/181/Qearn.json +0 -360
- package/data/epochs/181/Qswap.json +0 -755
- package/data/epochs/181/Quottery.json +0 -396
- package/data/epochs/181/Qx.json +0 -505
- package/data/epochs/181/Random.json +0 -33
- package/data/epochs/181/SupplyWatcher.json +0 -10
- package/data/epochs/182/ComputorControlledFund.json +0 -453
- package/data/epochs/182/GeneralQuorumProposal.json +0 -428
- package/data/epochs/182/MsVault.json +0 -961
- package/data/epochs/182/MyLastMatch.json +0 -10
- package/data/epochs/182/Nostromo.json +0 -978
- package/data/epochs/182/QUtil.json +0 -528
- package/data/epochs/182/QVAULT.json +0 -286
- package/data/epochs/182/Qbay.json +0 -1325
- package/data/epochs/182/Qdraw.json +0 -120
- package/data/epochs/182/Qearn.json +0 -360
- package/data/epochs/182/Qswap.json +0 -755
- package/data/epochs/182/Quottery.json +0 -396
- package/data/epochs/182/Qx.json +0 -505
- package/data/epochs/182/Random.json +0 -33
- package/data/epochs/182/SupplyWatcher.json +0 -10
- package/data/epochs/183/ComputorControlledFund.json +0 -453
- package/data/epochs/183/GeneralQuorumProposal.json +0 -428
- package/data/epochs/183/MsVault.json +0 -961
- package/data/epochs/183/MyLastMatch.json +0 -10
- package/data/epochs/183/Nostromo.json +0 -978
- package/data/epochs/183/QBond.json +0 -589
- package/data/epochs/183/QUtil.json +0 -528
- package/data/epochs/183/QVAULT.json +0 -286
- package/data/epochs/183/Qbay.json +0 -1325
- package/data/epochs/183/Qdraw.json +0 -120
- package/data/epochs/183/Qearn.json +0 -360
- package/data/epochs/183/Qswap.json +0 -755
- package/data/epochs/183/Quottery.json +0 -396
- package/data/epochs/183/Qx.json +0 -505
- package/data/epochs/183/Random.json +0 -33
- package/data/epochs/183/RandomLottery.json +0 -161
- package/data/epochs/183/SupplyWatcher.json +0 -10
- package/data/epochs/184/ComputorControlledFund.json +0 -453
- package/data/epochs/184/GeneralQuorumProposal.json +0 -428
- package/data/epochs/184/MsVault.json +0 -961
- package/data/epochs/184/MyLastMatch.json +0 -10
- package/data/epochs/184/Nostromo.json +0 -978
- package/data/epochs/184/QBond.json +0 -589
- package/data/epochs/184/QUtil.json +0 -528
- package/data/epochs/184/QVAULT.json +0 -286
- package/data/epochs/184/Qbay.json +0 -1325
- package/data/epochs/184/Qdraw.json +0 -120
- package/data/epochs/184/Qearn.json +0 -360
- package/data/epochs/184/Qswap.json +0 -755
- package/data/epochs/184/Quottery.json +0 -396
- package/data/epochs/184/Qx.json +0 -505
- package/data/epochs/184/Random.json +0 -33
- package/data/epochs/184/RandomLottery.json +0 -161
- package/data/epochs/184/SupplyWatcher.json +0 -10
- package/data/epochs/185/ComputorControlledFund.json +0 -453
- package/data/epochs/185/GeneralQuorumProposal.json +0 -428
- package/data/epochs/185/MsVault.json +0 -961
- package/data/epochs/185/MyLastMatch.json +0 -10
- package/data/epochs/185/Nostromo.json +0 -978
- package/data/epochs/185/QBond.json +0 -589
- package/data/epochs/185/QUtil.json +0 -528
- package/data/epochs/185/QVAULT.json +0 -286
- package/data/epochs/185/Qbay.json +0 -1325
- package/data/epochs/185/Qdraw.json +0 -120
- package/data/epochs/185/Qearn.json +0 -360
- package/data/epochs/185/Qswap.json +0 -755
- package/data/epochs/185/Quottery.json +0 -396
- package/data/epochs/185/Qx.json +0 -505
- package/data/epochs/185/Random.json +0 -33
- package/data/epochs/185/RandomLottery.json +0 -161
- package/data/epochs/185/SupplyWatcher.json +0 -10
- package/data/epochs/186/ComputorControlledFund.json +0 -453
- package/data/epochs/186/GeneralQuorumProposal.json +0 -428
- package/data/epochs/186/MsVault.json +0 -961
- package/data/epochs/186/MyLastMatch.json +0 -10
- package/data/epochs/186/Nostromo.json +0 -978
- package/data/epochs/186/QBond.json +0 -589
- package/data/epochs/186/QVAULT.json +0 -286
- package/data/epochs/186/Qbay.json +0 -1325
- package/data/epochs/186/Qdraw.json +0 -120
- package/data/epochs/186/Qearn.json +0 -360
- package/data/epochs/186/Qswap.json +0 -755
- package/data/epochs/186/Quottery.json +0 -396
- package/data/epochs/186/Qx.json +0 -505
- package/data/epochs/186/Random.json +0 -33
- package/data/epochs/186/SupplyWatcher.json +0 -10
- package/data/epochs/187/ComputorControlledFund.json +0 -453
- package/data/epochs/187/GeneralQuorumProposal.json +0 -428
- package/data/epochs/187/MsVault.json +0 -961
- package/data/epochs/187/MyLastMatch.json +0 -10
- package/data/epochs/187/Nostromo.json +0 -978
- package/data/epochs/187/QBond.json +0 -589
- package/data/epochs/187/QVAULT.json +0 -286
- package/data/epochs/187/Qbay.json +0 -1325
- package/data/epochs/187/Qdraw.json +0 -120
- package/data/epochs/187/Qearn.json +0 -360
- package/data/epochs/187/Qswap.json +0 -755
- package/data/epochs/187/Quottery.json +0 -396
- package/data/epochs/187/Qx.json +0 -505
- package/data/epochs/187/Random.json +0 -33
- package/data/epochs/187/RandomLottery.json +0 -344
- package/data/epochs/187/SupplyWatcher.json +0 -10
- package/data/epochs/188/ComputorControlledFund.json +0 -453
- package/data/epochs/188/GeneralQuorumProposal.json +0 -428
- package/data/epochs/188/MsVault.json +0 -961
- package/data/epochs/188/MyLastMatch.json +0 -10
- package/data/epochs/188/Nostromo.json +0 -978
- package/data/epochs/188/QBond.json +0 -589
- package/data/epochs/188/QUtil.json +0 -650
- package/data/epochs/188/QVAULT.json +0 -286
- package/data/epochs/188/Qbay.json +0 -1325
- package/data/epochs/188/Qdraw.json +0 -120
- package/data/epochs/188/Qearn.json +0 -360
- package/data/epochs/188/Qswap.json +0 -755
- package/data/epochs/188/Quottery.json +0 -396
- package/data/epochs/188/Qx.json +0 -505
- package/data/epochs/188/Random.json +0 -33
- package/data/epochs/188/RandomLottery.json +0 -344
- package/data/epochs/188/SupplyWatcher.json +0 -10
- package/data/epochs/189/ComputorControlledFund.json +0 -453
- package/data/epochs/189/GeneralQuorumProposal.json +0 -428
- package/data/epochs/189/MsVault.json +0 -961
- package/data/epochs/189/MyLastMatch.json +0 -10
- package/data/epochs/189/Nostromo.json +0 -978
- package/data/epochs/189/QBond.json +0 -589
- package/data/epochs/189/QUtil.json +0 -650
- package/data/epochs/189/QVAULT.json +0 -286
- package/data/epochs/189/Qbay.json +0 -1325
- package/data/epochs/189/Qdraw.json +0 -120
- package/data/epochs/189/Qearn.json +0 -360
- package/data/epochs/189/Qswap.json +0 -755
- package/data/epochs/189/Quottery.json +0 -396
- package/data/epochs/189/Qx.json +0 -505
- package/data/epochs/189/Random.json +0 -33
- package/data/epochs/189/RandomLottery.json +0 -344
- package/data/epochs/189/SupplyWatcher.json +0 -10
- package/data/epochs/190/ComputorControlledFund.json +0 -453
- package/data/epochs/190/GeneralQuorumProposal.json +0 -428
- package/data/epochs/190/MsVault.json +0 -961
- package/data/epochs/190/MyLastMatch.json +0 -10
- package/data/epochs/190/Nostromo.json +0 -978
- package/data/epochs/190/QBond.json +0 -589
- package/data/epochs/190/QUtil.json +0 -650
- package/data/epochs/190/QVAULT.json +0 -286
- package/data/epochs/190/Qbay.json +0 -1325
- package/data/epochs/190/Qdraw.json +0 -120
- package/data/epochs/190/Qearn.json +0 -360
- package/data/epochs/190/Qswap.json +0 -755
- package/data/epochs/190/Quottery.json +0 -396
- package/data/epochs/190/Qx.json +0 -505
- package/data/epochs/190/Random.json +0 -33
- package/data/epochs/190/RandomLottery.json +0 -344
- package/data/epochs/190/SupplyWatcher.json +0 -10
- package/data/epochs/191/ComputorControlledFund.json +0 -453
- package/data/epochs/191/GeneralQuorumProposal.json +0 -428
- package/data/epochs/191/MsVault.json +0 -961
- package/data/epochs/191/MyLastMatch.json +0 -10
- package/data/epochs/191/Nostromo.json +0 -978
- package/data/epochs/191/QBond.json +0 -589
- package/data/epochs/191/QIP.json +0 -286
- package/data/epochs/191/QUtil.json +0 -650
- package/data/epochs/191/QVAULT.json +0 -286
- package/data/epochs/191/Qbay.json +0 -1325
- package/data/epochs/191/Qdraw.json +0 -120
- package/data/epochs/191/Qearn.json +0 -360
- package/data/epochs/191/Quottery.json +0 -396
- package/data/epochs/191/Qx.json +0 -505
- package/data/epochs/191/Random.json +0 -33
- package/data/epochs/191/RandomLottery.json +0 -344
- package/data/epochs/191/SupplyWatcher.json +0 -10
- package/data/epochs/192/GeneralQuorumProposal.json +0 -428
- package/data/epochs/192/MsVault.json +0 -961
- package/data/epochs/192/MyLastMatch.json +0 -10
- package/data/epochs/192/Nostromo.json +0 -978
- package/data/epochs/192/QBond.json +0 -589
- package/data/epochs/192/QIP.json +0 -286
- package/data/epochs/192/QUtil.json +0 -650
- package/data/epochs/192/QVAULT.json +0 -286
- package/data/epochs/192/Qbay.json +0 -1325
- package/data/epochs/192/Qdraw.json +0 -120
- package/data/epochs/192/Qearn.json +0 -360
- package/data/epochs/192/Quottery.json +0 -396
- package/data/epochs/192/Qx.json +0 -505
- package/data/epochs/192/Random.json +0 -33
- package/data/epochs/192/RandomLottery.json +0 -344
- package/data/epochs/192/SupplyWatcher.json +0 -10
- package/data/epochs/193/ComputorControlledFund.json +0 -712
- package/data/epochs/193/GeneralQuorumProposal.json +0 -428
- package/data/epochs/193/MsVault.json +0 -961
- package/data/epochs/193/MyLastMatch.json +0 -10
- package/data/epochs/193/Nostromo.json +0 -978
- package/data/epochs/193/QBond.json +0 -589
- package/data/epochs/193/QIP.json +0 -286
- package/data/epochs/193/QRaffle.json +0 -663
- package/data/epochs/193/QUtil.json +0 -650
- package/data/epochs/193/QVAULT.json +0 -286
- package/data/epochs/193/Qbay.json +0 -1325
- package/data/epochs/193/Qdraw.json +0 -120
- package/data/epochs/193/Qearn.json +0 -360
- package/data/epochs/193/Qswap.json +0 -767
- package/data/epochs/193/Quottery.json +0 -396
- package/data/epochs/193/Qx.json +0 -505
- package/data/epochs/193/Random.json +0 -33
- package/data/epochs/193/RandomLottery.json +0 -344
- package/data/epochs/193/SupplyWatcher.json +0 -10
- package/data/epochs/194/ComputorControlledFund.json +0 -712
- package/data/epochs/194/GeneralQuorumProposal.json +0 -428
- package/data/epochs/194/MsVault.json +0 -961
- package/data/epochs/194/MyLastMatch.json +0 -10
- package/data/epochs/194/Nostromo.json +0 -978
- package/data/epochs/194/QBond.json +0 -589
- package/data/epochs/194/QIP.json +0 -286
- package/data/epochs/194/QRaffle.json +0 -663
- package/data/epochs/194/QUtil.json +0 -650
- package/data/epochs/194/QVAULT.json +0 -286
- package/data/epochs/194/Qbay.json +0 -1325
- package/data/epochs/194/Qdraw.json +0 -120
- package/data/epochs/194/Qearn.json +0 -360
- package/data/epochs/194/Qswap.json +0 -767
- package/data/epochs/194/Quottery.json +0 -396
- package/data/epochs/194/Qx.json +0 -505
- package/data/epochs/194/Random.json +0 -33
- package/data/epochs/194/RandomLottery.json +0 -344
- package/data/epochs/194/SupplyWatcher.json +0 -10
- package/data/epochs/195/ComputorControlledFund.json +0 -712
- package/data/epochs/195/GeneralQuorumProposal.json +0 -428
- package/data/epochs/195/MsVault.json +0 -961
- package/data/epochs/195/MyLastMatch.json +0 -10
- package/data/epochs/195/Nostromo.json +0 -978
- package/data/epochs/195/QBond.json +0 -589
- package/data/epochs/195/QIP.json +0 -286
- package/data/epochs/195/QRaffle.json +0 -663
- package/data/epochs/195/QUtil.json +0 -650
- package/data/epochs/195/QVAULT.json +0 -286
- package/data/epochs/195/Qbay.json +0 -1325
- package/data/epochs/195/Qdraw.json +0 -120
- package/data/epochs/195/Qearn.json +0 -360
- package/data/epochs/195/Qswap.json +0 -767
- package/data/epochs/195/Quottery.json +0 -396
- package/data/epochs/195/Qx.json +0 -505
- package/data/epochs/195/Random.json +0 -33
- package/data/epochs/195/RandomLottery.json +0 -344
- package/data/epochs/195/SupplyWatcher.json +0 -10
- package/data/epochs/196/ComputorControlledFund.json +0 -712
- package/data/epochs/196/GeneralQuorumProposal.json +0 -428
- package/data/epochs/196/MsVault.json +0 -961
- package/data/epochs/196/MyLastMatch.json +0 -10
- package/data/epochs/196/Nostromo.json +0 -978
- package/data/epochs/196/QBond.json +0 -589
- package/data/epochs/196/QIP.json +0 -286
- package/data/epochs/196/QRaffle.json +0 -663
- package/data/epochs/196/QUtil.json +0 -650
- package/data/epochs/196/QVAULT.json +0 -286
- package/data/epochs/196/Qbay.json +0 -1325
- package/data/epochs/196/Qdraw.json +0 -120
- package/data/epochs/196/Qearn.json +0 -360
- package/data/epochs/196/Qswap.json +0 -767
- package/data/epochs/196/Quottery.json +0 -396
- package/data/epochs/196/Qx.json +0 -505
- package/data/epochs/196/Random.json +0 -33
- package/data/epochs/196/RandomLottery.json +0 -344
- package/data/epochs/196/SupplyWatcher.json +0 -10
- package/data/epochs/197/ComputorControlledFund.json +0 -712
- package/data/epochs/197/GeneralQuorumProposal.json +0 -428
- package/data/epochs/197/MsVault.json +0 -961
- package/data/epochs/197/MyLastMatch.json +0 -10
- package/data/epochs/197/Nostromo.json +0 -978
- package/data/epochs/197/QBond.json +0 -589
- package/data/epochs/197/QIP.json +0 -286
- package/data/epochs/197/QRaffle.json +0 -663
- package/data/epochs/197/QUtil.json +0 -650
- package/data/epochs/197/QVAULT.json +0 -286
- package/data/epochs/197/Qbay.json +0 -1325
- package/data/epochs/197/Qdraw.json +0 -120
- package/data/epochs/197/Qearn.json +0 -360
- package/data/epochs/197/Qswap.json +0 -767
- package/data/epochs/197/Quottery.json +0 -396
- package/data/epochs/197/Qx.json +0 -505
- package/data/epochs/197/Random.json +0 -33
- package/data/epochs/197/RandomLottery.json +0 -344
- package/data/epochs/197/SupplyWatcher.json +0 -10
- package/data/epochs/198/ComputorControlledFund.json +0 -712
- package/data/epochs/198/GeneralQuorumProposal.json +0 -428
- package/data/epochs/198/MsVault.json +0 -961
- package/data/epochs/198/MyLastMatch.json +0 -10
- package/data/epochs/198/Nostromo.json +0 -978
- package/data/epochs/198/QBond.json +0 -589
- package/data/epochs/198/QIP.json +0 -286
- package/data/epochs/198/QRaffle.json +0 -663
- package/data/epochs/198/QUtil.json +0 -650
- package/data/epochs/198/QVAULT.json +0 -286
- package/data/epochs/198/Qbay.json +0 -1325
- package/data/epochs/198/Qdraw.json +0 -120
- package/data/epochs/198/Qearn.json +0 -360
- package/data/epochs/198/Qswap.json +0 -767
- package/data/epochs/198/Quottery.json +0 -396
- package/data/epochs/198/Qx.json +0 -505
- package/data/epochs/198/Random.json +0 -33
- package/data/epochs/198/RandomLottery.json +0 -344
- package/data/epochs/198/SupplyWatcher.json +0 -10
- package/data/epochs/198/qRWA.json +0 -624
- package/data/epochs/199/ComputorControlledFund.json +0 -712
- package/data/epochs/199/GeneralQuorumProposal.json +0 -428
- package/data/epochs/199/MsVault.json +0 -961
- package/data/epochs/199/MyLastMatch.json +0 -10
- package/data/epochs/199/Nostromo.json +0 -978
- package/data/epochs/199/QBond.json +0 -589
- package/data/epochs/199/QIP.json +0 -286
- package/data/epochs/199/QRaffle.json +0 -663
- package/data/epochs/199/QUtil.json +0 -650
- package/data/epochs/199/QVAULT.json +0 -286
- package/data/epochs/199/Qbay.json +0 -1325
- package/data/epochs/199/Qdraw.json +0 -120
- package/data/epochs/199/Qearn.json +0 -360
- package/data/epochs/199/Qswap.json +0 -767
- package/data/epochs/199/Quottery.json +0 -396
- package/data/epochs/199/Qx.json +0 -505
- package/data/epochs/199/Random.json +0 -33
- package/data/epochs/199/RandomLottery.json +0 -344
- package/data/epochs/199/SupplyWatcher.json +0 -10
- package/data/epochs/199/qRWA.json +0 -624
- package/data/epochs/200/ComputorControlledFund.json +0 -712
- package/data/epochs/200/GeneralQuorumProposal.json +0 -428
- package/data/epochs/200/MsVault.json +0 -961
- package/data/epochs/200/MyLastMatch.json +0 -10
- package/data/epochs/200/Nostromo.json +0 -978
- package/data/epochs/200/QBond.json +0 -589
- package/data/epochs/200/QDuel.json +0 -368
- package/data/epochs/200/QIP.json +0 -286
- package/data/epochs/200/QRaffle.json +0 -663
- package/data/epochs/200/QReservePool.json +0 -122
- package/data/epochs/200/QThirtyFour.json +0 -480
- package/data/epochs/200/QUtil.json +0 -650
- package/data/epochs/200/QVAULT.json +0 -286
- package/data/epochs/200/Qbay.json +0 -1325
- package/data/epochs/200/Qdraw.json +0 -120
- package/data/epochs/200/Qearn.json +0 -360
- package/data/epochs/200/Qswap.json +0 -767
- package/data/epochs/200/Quottery.json +0 -396
- package/data/epochs/200/Qx.json +0 -505
- package/data/epochs/200/Random.json +0 -33
- package/data/epochs/200/RandomLottery.json +0 -344
- package/data/epochs/200/SupplyWatcher.json +0 -10
- package/data/epochs/200/qRWA.json +0 -624
- package/data/epochs/201/ComputorControlledFund.json +0 -712
- package/data/epochs/201/GeneralQuorumProposal.json +0 -428
- package/data/epochs/201/MsVault.json +0 -961
- package/data/epochs/201/MyLastMatch.json +0 -10
- package/data/epochs/201/Nostromo.json +0 -978
- package/data/epochs/201/QBond.json +0 -589
- package/data/epochs/201/QIP.json +0 -286
- package/data/epochs/201/QRaffle.json +0 -663
- package/data/epochs/201/QThirtyFour.json +0 -480
- package/data/epochs/201/QUtil.json +0 -650
- package/data/epochs/201/QVAULT.json +0 -286
- package/data/epochs/201/Qbay.json +0 -1325
- package/data/epochs/201/Qdraw.json +0 -120
- package/data/epochs/201/Qearn.json +0 -360
- package/data/epochs/201/Quottery.json +0 -396
- package/data/epochs/201/Qx.json +0 -505
- package/data/epochs/201/Random.json +0 -33
- package/data/epochs/201/RandomLottery.json +0 -344
- package/data/epochs/201/SupplyWatcher.json +0 -10
- package/data/epochs/201/qRWA.json +0 -624
- package/data/epochs/202/ComputorControlledFund.json +0 -712
- package/data/epochs/202/GeneralQuorumProposal.json +0 -428
- package/data/epochs/202/MsVault.json +0 -961
- package/data/epochs/202/MyLastMatch.json +0 -10
- package/data/epochs/202/Nostromo.json +0 -978
- package/data/epochs/202/QBond.json +0 -589
- package/data/epochs/202/QIP.json +0 -286
- package/data/epochs/202/QRaffle.json +0 -663
- package/data/epochs/202/QReservePool.json +0 -151
- package/data/epochs/202/QUtil.json +0 -650
- package/data/epochs/202/QVAULT.json +0 -286
- package/data/epochs/202/Qbay.json +0 -1325
- package/data/epochs/202/Qdraw.json +0 -120
- package/data/epochs/202/Qearn.json +0 -360
- package/data/epochs/202/Qswap.json +0 -761
- package/data/epochs/202/Quottery.json +0 -396
- package/data/epochs/202/Qx.json +0 -505
- package/data/epochs/202/Random.json +0 -33
- package/data/epochs/202/RandomLottery.json +0 -344
- package/data/epochs/202/SupplyWatcher.json +0 -10
- package/data/epochs/202/qRWA.json +0 -624
- package/data/epochs/203/ComputorControlledFund.json +0 -712
- package/data/epochs/203/GeneralQuorumProposal.json +0 -428
- package/data/epochs/203/MsVault.json +0 -961
- package/data/epochs/203/MyLastMatch.json +0 -10
- package/data/epochs/203/Nostromo.json +0 -978
- package/data/epochs/203/QBond.json +0 -589
- package/data/epochs/203/QDuel.json +0 -499
- package/data/epochs/203/QIP.json +0 -286
- package/data/epochs/203/QReservePool.json +0 -151
- package/data/epochs/203/QThirtyFour.json +0 -588
- package/data/epochs/203/QUtil.json +0 -650
- package/data/epochs/203/QVAULT.json +0 -286
- package/data/epochs/203/Qbay.json +0 -1325
- package/data/epochs/203/Qdraw.json +0 -120
- package/data/epochs/203/Qearn.json +0 -360
- package/data/epochs/203/Qswap.json +0 -761
- package/data/epochs/203/Quottery.json +0 -396
- package/data/epochs/203/Qx.json +0 -505
- package/data/epochs/203/Random.json +0 -33
- package/data/epochs/203/RandomLottery.json +0 -344
- package/data/epochs/203/SupplyWatcher.json +0 -10
- package/data/epochs/203/qRWA.json +0 -624
- package/data/epochs/204/ComputorControlledFund.json +0 -712
- package/data/epochs/204/GeneralQuorumProposal.json +0 -428
- package/data/epochs/204/MsVault.json +0 -961
- package/data/epochs/204/MyLastMatch.json +0 -10
- package/data/epochs/204/Nostromo.json +0 -978
- package/data/epochs/204/QDuel.json +0 -499
- package/data/epochs/204/QIP.json +0 -286
- package/data/epochs/204/QReservePool.json +0 -151
- package/data/epochs/204/QThirtyFour.json +0 -588
- package/data/epochs/204/Qbay.json +0 -1325
- package/data/epochs/204/Qdraw.json +0 -120
- package/data/epochs/204/Qearn.json +0 -360
- package/data/epochs/204/Qswap.json +0 -761
- package/data/epochs/204/Quottery.json +0 -396
- package/data/epochs/204/Qx.json +0 -505
- package/data/epochs/204/Random.json +0 -33
- package/data/epochs/204/RandomLottery.json +0 -344
- package/data/epochs/204/SupplyWatcher.json +0 -10
- package/data/epochs/205/ComputorControlledFund.json +0 -712
- package/data/epochs/205/GeneralQuorumProposal.json +0 -428
- package/data/epochs/205/MsVault.json +0 -961
- package/data/epochs/205/MyLastMatch.json +0 -10
- package/data/epochs/205/Nostromo.json +0 -978
- package/data/epochs/205/Pulse.json +0 -577
- package/data/epochs/205/QBond.json +0 -583
- package/data/epochs/205/QDuel.json +0 -499
- package/data/epochs/205/QIP.json +0 -286
- package/data/epochs/205/QRaffle.json +0 -669
- package/data/epochs/205/QReservePool.json +0 -151
- package/data/epochs/205/QThirtyFour.json +0 -588
- package/data/epochs/205/QUtil.json +0 -782
- package/data/epochs/205/Qbay.json +0 -1325
- package/data/epochs/205/Qdraw.json +0 -120
- package/data/epochs/205/Qearn.json +0 -360
- package/data/epochs/205/Qswap.json +0 -761
- package/data/epochs/205/Quottery.json +0 -396
- package/data/epochs/205/Qx.json +0 -505
- package/data/epochs/205/Random.json +0 -33
- package/data/epochs/205/RandomLottery.json +0 -344
- package/data/epochs/205/SupplyWatcher.json +0 -10
- package/data/epochs/205/qRWA.json +0 -624
- package/data/epochs/206/ComputorControlledFund.json +0 -712
- package/data/epochs/206/GeneralQuorumProposal.json +0 -428
- package/data/epochs/206/MsVault.json +0 -961
- package/data/epochs/206/MyLastMatch.json +0 -10
- package/data/epochs/206/Nostromo.json +0 -978
- package/data/epochs/206/Pulse.json +0 -577
- package/data/epochs/206/QBond.json +0 -583
- package/data/epochs/206/QDuel.json +0 -499
- package/data/epochs/206/QIP.json +0 -286
- package/data/epochs/206/QRaffle.json +0 -669
- package/data/epochs/206/QReservePool.json +0 -151
- package/data/epochs/206/QUtil.json +0 -782
- package/data/epochs/206/QVAULT.json +0 -1739
- package/data/epochs/206/Qbay.json +0 -1325
- package/data/epochs/206/Qdraw.json +0 -120
- package/data/epochs/206/Qearn.json +0 -360
- package/data/epochs/206/Qswap.json +0 -761
- package/data/epochs/206/Quottery.json +0 -396
- package/data/epochs/206/Qx.json +0 -505
- package/data/epochs/206/RandomLottery.json +0 -344
- package/data/epochs/206/SupplyWatcher.json +0 -10
- package/data/epochs/206/qRWA.json +0 -624
- package/data/epochs/207/ComputorControlledFund.json +0 -712
- package/data/epochs/207/GeneralQuorumProposal.json +0 -428
- package/data/epochs/207/MsVault.json +0 -961
- package/data/epochs/207/MyLastMatch.json +0 -10
- package/data/epochs/207/Nostromo.json +0 -978
- package/data/epochs/207/QBond.json +0 -583
- package/data/epochs/207/QDuel.json +0 -499
- package/data/epochs/207/QIP.json +0 -286
- package/data/epochs/207/QRaffle.json +0 -669
- package/data/epochs/207/QReservePool.json +0 -151
- package/data/epochs/207/QThirtyFour.json +0 -658
- package/data/epochs/207/QUtil.json +0 -782
- package/data/epochs/207/QVAULT.json +0 -1739
- package/data/epochs/207/Qbay.json +0 -1325
- package/data/epochs/207/Qdraw.json +0 -120
- package/data/epochs/207/Qearn.json +0 -360
- package/data/epochs/207/Qswap.json +0 -761
- package/data/epochs/207/Quottery.json +0 -396
- package/data/epochs/207/Qx.json +0 -505
- package/data/epochs/207/Random.json +0 -33
- package/data/epochs/207/RandomLottery.json +0 -344
- package/data/epochs/207/SupplyWatcher.json +0 -10
- package/data/epochs/207/VottunBridge.json +0 -739
- package/data/epochs/207/qRWA.json +0 -624
- package/data/epochs/208/ComputorControlledFund.json +0 -712
- package/data/epochs/208/GeneralQuorumProposal.json +0 -428
- package/data/epochs/208/MsVault.json +0 -961
- package/data/epochs/208/MyLastMatch.json +0 -10
- package/data/epochs/208/Nostromo.json +0 -978
- package/data/epochs/208/QBond.json +0 -583
- package/data/epochs/208/QDuel.json +0 -499
- package/data/epochs/208/QIP.json +0 -286
- package/data/epochs/208/QRaffle.json +0 -669
- package/data/epochs/208/QReservePool.json +0 -151
- package/data/epochs/208/QThirtyFour.json +0 -658
- package/data/epochs/208/QUtil.json +0 -782
- package/data/epochs/208/QVAULT.json +0 -1739
- package/data/epochs/208/Qbay.json +0 -1325
- package/data/epochs/208/Qdraw.json +0 -120
- package/data/epochs/208/Qearn.json +0 -360
- package/data/epochs/208/Qswap.json +0 -761
- package/data/epochs/208/Quottery.json +0 -396
- package/data/epochs/208/Qx.json +0 -505
- package/data/epochs/208/Random.json +0 -33
- package/data/epochs/208/RandomLottery.json +0 -344
- package/data/epochs/208/SupplyWatcher.json +0 -10
- package/data/epochs/208/VottunBridge.json +0 -739
- package/data/epochs/208/qRWA.json +0 -624
- package/data/epochs/209/ComputorControlledFund.json +0 -712
- package/data/epochs/209/GeneralQuorumProposal.json +0 -428
- package/data/epochs/209/MsVault.json +0 -961
- package/data/epochs/209/MyLastMatch.json +0 -10
- package/data/epochs/209/Nostromo.json +0 -978
- package/data/epochs/209/Pulse.json +0 -836
- package/data/epochs/209/QBond.json +0 -583
- package/data/epochs/209/QDuel.json +0 -499
- package/data/epochs/209/QIP.json +0 -286
- package/data/epochs/209/QRaffle.json +0 -669
- package/data/epochs/209/QReservePool.json +0 -151
- package/data/epochs/209/QThirtyFour.json +0 -658
- package/data/epochs/209/QVAULT.json +0 -1739
- package/data/epochs/209/Qbay.json +0 -1325
- package/data/epochs/209/Qdraw.json +0 -120
- package/data/epochs/209/Qearn.json +0 -360
- package/data/epochs/209/Quottery.json +0 -396
- package/data/epochs/209/Qusino.json +0 -455
- package/data/epochs/209/Qx.json +0 -505
- package/data/epochs/209/Random.json +0 -33
- package/data/epochs/209/RandomLottery.json +0 -344
- package/data/epochs/209/SupplyWatcher.json +0 -10
- package/data/epochs/209/VottunBridge.json +0 -739
- package/data/epochs/209/qRWA.json +0 -624
- package/data/epochs/210/ComputorControlledFund.json +0 -712
- package/data/epochs/210/GeneralQuorumProposal.json +0 -428
- package/data/epochs/210/MsVault.json +0 -961
- package/data/epochs/210/MyLastMatch.json +0 -10
- package/data/epochs/210/Nostromo.json +0 -978
- package/data/epochs/210/Pulse.json +0 -836
- package/data/epochs/210/QBond.json +0 -583
- package/data/epochs/210/QDuel.json +0 -499
- package/data/epochs/210/QIP.json +0 -286
- package/data/epochs/210/QRaffle.json +0 -669
- package/data/epochs/210/QReservePool.json +0 -151
- package/data/epochs/210/QThirtyFour.json +0 -658
- package/data/epochs/210/QVAULT.json +0 -1739
- package/data/epochs/210/Qbay.json +0 -1325
- package/data/epochs/210/Qdraw.json +0 -120
- package/data/epochs/210/Qearn.json +0 -360
- package/data/epochs/210/Qswap.json +0 -767
- package/data/epochs/210/Qusino.json +0 -455
- package/data/epochs/210/Qx.json +0 -505
- package/data/epochs/210/Random.json +0 -33
- package/data/epochs/210/RandomLottery.json +0 -344
- package/data/epochs/210/SupplyWatcher.json +0 -10
- package/data/epochs/210/VottunBridge.json +0 -739
- package/data/epochs/210/qRWA.json +0 -624
- package/data/epochs/211/ComputorControlledFund.json +0 -712
- package/data/epochs/211/Escrow.json +0 -367
- package/data/epochs/211/GeneralQuorumProposal.json +0 -428
- package/data/epochs/211/MsVault.json +0 -961
- package/data/epochs/211/MyLastMatch.json +0 -10
- package/data/epochs/211/Nostromo.json +0 -978
- package/data/epochs/211/Pulse.json +0 -836
- package/data/epochs/211/QBond.json +0 -583
- package/data/epochs/211/QDuel.json +0 -499
- package/data/epochs/211/QIP.json +0 -286
- package/data/epochs/211/QRaffle.json +0 -669
- package/data/epochs/211/QReservePool.json +0 -151
- package/data/epochs/211/QThirtyFour.json +0 -658
- package/data/epochs/211/QUtil.json +0 -888
- package/data/epochs/211/QVAULT.json +0 -1739
- package/data/epochs/211/Qbay.json +0 -1325
- package/data/epochs/211/Qdraw.json +0 -120
- package/data/epochs/211/Qearn.json +0 -360
- package/data/epochs/211/Qswap.json +0 -767
- package/data/epochs/211/Quottery.json +0 -979
- package/data/epochs/211/Qusino.json +0 -455
- package/data/epochs/211/Qx.json +0 -505
- package/data/epochs/211/Random.json +0 -33
- package/data/epochs/211/RandomLottery.json +0 -344
- package/data/epochs/211/SupplyWatcher.json +0 -10
- package/data/epochs/211/VottunBridge.json +0 -739
- package/data/epochs/211/qRWA.json +0 -624
- package/data/epochs/212/ComputorControlledFund.json +0 -712
- package/data/epochs/212/Escrow.json +0 -367
- package/data/epochs/212/GeneralQuorumProposal.json +0 -428
- package/data/epochs/212/MsVault.json +0 -961
- package/data/epochs/212/MyLastMatch.json +0 -10
- package/data/epochs/212/Nostromo.json +0 -978
- package/data/epochs/212/Pulse.json +0 -836
- package/data/epochs/212/QBond.json +0 -583
- package/data/epochs/212/QDuel.json +0 -499
- package/data/epochs/212/QIP.json +0 -286
- package/data/epochs/212/QRaffle.json +0 -669
- package/data/epochs/212/QReservePool.json +0 -151
- package/data/epochs/212/QThirtyFour.json +0 -658
- package/data/epochs/212/QUtil.json +0 -888
- package/data/epochs/212/QVAULT.json +0 -1739
- package/data/epochs/212/Qbay.json +0 -1325
- package/data/epochs/212/Qdraw.json +0 -120
- package/data/epochs/212/Qearn.json +0 -360
- package/data/epochs/212/Qswap.json +0 -767
- package/data/epochs/212/Quottery.json +0 -979
- package/data/epochs/212/Qusino.json +0 -455
- package/data/epochs/212/Qx.json +0 -505
- package/data/epochs/212/Random.json +0 -33
- package/data/epochs/212/RandomLottery.json +0 -344
- package/data/epochs/212/SupplyWatcher.json +0 -10
- package/data/epochs/212/VottunBridge.json +0 -739
- package/data/epochs/213/ComputorControlledFund.json +0 -712
- package/data/epochs/213/Escrow.json +0 -367
- package/data/epochs/213/GeneralQuorumProposal.json +0 -428
- package/data/epochs/213/MsVault.json +0 -961
- package/data/epochs/213/MyLastMatch.json +0 -10
- package/data/epochs/213/Nostromo.json +0 -978
- package/data/epochs/213/Pulse.json +0 -836
- package/data/epochs/213/QBond.json +0 -583
- package/data/epochs/213/QDuel.json +0 -499
- package/data/epochs/213/QIP.json +0 -286
- package/data/epochs/213/QRaffle.json +0 -669
- package/data/epochs/213/QReservePool.json +0 -151
- package/data/epochs/213/QThirtyFour.json +0 -658
- package/data/epochs/213/QUtil.json +0 -888
- package/data/epochs/213/QVAULT.json +0 -1739
- package/data/epochs/213/Qbay.json +0 -1325
- package/data/epochs/213/Qdraw.json +0 -120
- package/data/epochs/213/Qearn.json +0 -360
- package/data/epochs/213/Qswap.json +0 -767
- package/data/epochs/213/Quottery.json +0 -979
- package/data/epochs/213/Qusino.json +0 -455
- package/data/epochs/213/Qx.json +0 -505
- package/data/epochs/213/Random.json +0 -33
- package/data/epochs/213/RandomLottery.json +0 -344
- package/data/epochs/213/SupplyWatcher.json +0 -10
- package/data/epochs/213/VottunBridge.json +0 -739
- package/data/epochs/213/qRWA.json +0 -877
package/src/payload.ts
ADDED
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
import type { BinaryField, FieldType, NamedStruct } from './types.js'
|
|
2
|
+
|
|
3
|
+
// DecodedStruct uses unknown to avoid circular type constraint issues.
|
|
4
|
+
export type DecodedStruct = Record<string, unknown>
|
|
5
|
+
export type FieldValue = number | bigint | string | Uint8Array | FieldValue[] | DecodedStruct
|
|
6
|
+
|
|
7
|
+
export class PayloadBuildError extends Error {
|
|
8
|
+
constructor(message: string, options?: { cause?: unknown }) {
|
|
9
|
+
super(message, { cause: options?.cause })
|
|
10
|
+
this.name = 'PayloadBuildError'
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Encodes a contract call input into binary using registry field descriptors.
|
|
16
|
+
*
|
|
17
|
+
* Field encoding rules:
|
|
18
|
+
* uint8/16/32 → DataView.setUintN (little-endian)
|
|
19
|
+
* uint64/sint64 → DataView.setBigUint64 / setBigInt64 (little-endian)
|
|
20
|
+
* uint128 → two consecutive uint64 LE (lo word first, hi word second)
|
|
21
|
+
* id → 32-byte public key via injected identityToPublicKey
|
|
22
|
+
* bytes → Uint8Array copied verbatim (must be exactly field.byteLength)
|
|
23
|
+
* struct → recursively encoded using structs[field.structRef].fields
|
|
24
|
+
* array → N items encoded sequentially
|
|
25
|
+
*
|
|
26
|
+
* Advanced mode: pass a Uint8Array as the value for any field. Its length must
|
|
27
|
+
* equal field.byteLength — it is copied verbatim without type coercion.
|
|
28
|
+
*
|
|
29
|
+
* @throws {PayloadBuildError} on type mismatch, out-of-range value, or length mismatch
|
|
30
|
+
*/
|
|
31
|
+
export function buildPayload(
|
|
32
|
+
fields: BinaryField[],
|
|
33
|
+
structs: Record<string, NamedStruct>,
|
|
34
|
+
input: Record<string, FieldValue | Uint8Array>,
|
|
35
|
+
identityToPublicKey: (identity: string) => Uint8Array,
|
|
36
|
+
): Uint8Array {
|
|
37
|
+
const totalSize = fields.reduce((s, f) => s + f.byteLength, 0)
|
|
38
|
+
const buf = new Uint8Array(totalSize)
|
|
39
|
+
const view = new DataView(buf.buffer)
|
|
40
|
+
|
|
41
|
+
for (const field of fields) {
|
|
42
|
+
const raw = input[field.name]
|
|
43
|
+
if (raw === undefined) {
|
|
44
|
+
throw new PayloadBuildError(`Missing field "${field.name}"`)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Advanced mode: Uint8Array verbatim copy
|
|
48
|
+
if (raw instanceof Uint8Array) {
|
|
49
|
+
if (raw.byteLength !== field.byteLength) {
|
|
50
|
+
throw new PayloadBuildError(
|
|
51
|
+
`Field "${field.name}": Uint8Array length ${raw.byteLength} !== expected ${field.byteLength}`,
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
buf.set(raw, field.offset)
|
|
55
|
+
continue
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
encodeField(field, raw as FieldValue, buf, view, field.offset, structs, identityToPublicKey)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return buf
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// ── Shared scalar encoder ─────────────────────────────────────────────────────
|
|
65
|
+
|
|
66
|
+
function writeScalar(
|
|
67
|
+
type: FieldType,
|
|
68
|
+
fieldName: string,
|
|
69
|
+
value: FieldValue,
|
|
70
|
+
buf: Uint8Array,
|
|
71
|
+
view: DataView,
|
|
72
|
+
offset: number,
|
|
73
|
+
identityToPublicKey: (identity: string) => Uint8Array,
|
|
74
|
+
): void {
|
|
75
|
+
switch (type) {
|
|
76
|
+
case 'uint8':
|
|
77
|
+
if (typeof value !== 'number')
|
|
78
|
+
throw new PayloadBuildError(`Field "${fieldName}": expected number`)
|
|
79
|
+
view.setUint8(offset, value)
|
|
80
|
+
break
|
|
81
|
+
case 'sint8':
|
|
82
|
+
if (typeof value !== 'number')
|
|
83
|
+
throw new PayloadBuildError(`Field "${fieldName}": expected number`)
|
|
84
|
+
view.setInt8(offset, value)
|
|
85
|
+
break
|
|
86
|
+
case 'uint16':
|
|
87
|
+
if (typeof value !== 'number')
|
|
88
|
+
throw new PayloadBuildError(`Field "${fieldName}": expected number`)
|
|
89
|
+
view.setUint16(offset, value, true)
|
|
90
|
+
break
|
|
91
|
+
case 'sint16':
|
|
92
|
+
if (typeof value !== 'number')
|
|
93
|
+
throw new PayloadBuildError(`Field "${fieldName}": expected number`)
|
|
94
|
+
view.setInt16(offset, value, true)
|
|
95
|
+
break
|
|
96
|
+
case 'uint32':
|
|
97
|
+
if (typeof value !== 'number')
|
|
98
|
+
throw new PayloadBuildError(`Field "${fieldName}": expected number`)
|
|
99
|
+
view.setUint32(offset, value, true)
|
|
100
|
+
break
|
|
101
|
+
case 'sint32':
|
|
102
|
+
if (typeof value !== 'number')
|
|
103
|
+
throw new PayloadBuildError(`Field "${fieldName}": expected number`)
|
|
104
|
+
view.setInt32(offset, value, true)
|
|
105
|
+
break
|
|
106
|
+
case 'uint64':
|
|
107
|
+
if (typeof value !== 'bigint')
|
|
108
|
+
throw new PayloadBuildError(`Field "${fieldName}": expected bigint`)
|
|
109
|
+
view.setBigUint64(offset, value, true)
|
|
110
|
+
break
|
|
111
|
+
case 'sint64':
|
|
112
|
+
if (typeof value !== 'bigint')
|
|
113
|
+
throw new PayloadBuildError(`Field "${fieldName}": expected bigint`)
|
|
114
|
+
view.setBigInt64(offset, value, true)
|
|
115
|
+
break
|
|
116
|
+
case 'uint128': {
|
|
117
|
+
if (typeof value !== 'bigint')
|
|
118
|
+
throw new PayloadBuildError(`Field "${fieldName}": expected bigint`)
|
|
119
|
+
view.setBigUint64(offset, value & 0xffffffffffffffffn, true)
|
|
120
|
+
view.setBigUint64(offset + 8, value >> 64n, true)
|
|
121
|
+
break
|
|
122
|
+
}
|
|
123
|
+
case 'id': {
|
|
124
|
+
if (typeof value !== 'string')
|
|
125
|
+
throw new PayloadBuildError(`Field "${fieldName}": expected Identity string`)
|
|
126
|
+
buf.set(identityToPublicKey(value).subarray(0, 32), offset)
|
|
127
|
+
break
|
|
128
|
+
}
|
|
129
|
+
default:
|
|
130
|
+
throw new PayloadBuildError(`Scalar encoding not supported for type "${type}"`)
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// ── Shared scalar decoder ─────────────────────────────────────────────────────
|
|
135
|
+
|
|
136
|
+
function readScalar(
|
|
137
|
+
type: FieldType,
|
|
138
|
+
data: Uint8Array,
|
|
139
|
+
view: DataView,
|
|
140
|
+
offset: number,
|
|
141
|
+
publicKeyToIdentity: (pk: Uint8Array) => string,
|
|
142
|
+
): FieldValue {
|
|
143
|
+
switch (type) {
|
|
144
|
+
case 'uint8':
|
|
145
|
+
return view.getUint8(offset)
|
|
146
|
+
case 'sint8':
|
|
147
|
+
return view.getInt8(offset)
|
|
148
|
+
case 'uint16':
|
|
149
|
+
return view.getUint16(offset, true)
|
|
150
|
+
case 'sint16':
|
|
151
|
+
return view.getInt16(offset, true)
|
|
152
|
+
case 'uint32':
|
|
153
|
+
return view.getUint32(offset, true)
|
|
154
|
+
case 'sint32':
|
|
155
|
+
return view.getInt32(offset, true)
|
|
156
|
+
case 'uint64':
|
|
157
|
+
return view.getBigUint64(offset, true)
|
|
158
|
+
case 'sint64':
|
|
159
|
+
return view.getBigInt64(offset, true)
|
|
160
|
+
case 'uint128': {
|
|
161
|
+
const lo = view.getBigUint64(offset, true)
|
|
162
|
+
const hi = view.getBigUint64(offset + 8, true)
|
|
163
|
+
return lo + hi * 2n ** 64n
|
|
164
|
+
}
|
|
165
|
+
case 'id':
|
|
166
|
+
return publicKeyToIdentity(data.subarray(offset, offset + 32))
|
|
167
|
+
default:
|
|
168
|
+
throw new PayloadBuildError(`Scalar decoding not supported for type "${type}"`)
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// ── Field encoder ─────────────────────────────────────────────────────────────
|
|
173
|
+
|
|
174
|
+
function encodeField(
|
|
175
|
+
field: BinaryField,
|
|
176
|
+
value: FieldValue,
|
|
177
|
+
buf: Uint8Array,
|
|
178
|
+
view: DataView,
|
|
179
|
+
offset: number,
|
|
180
|
+
structs: Record<string, NamedStruct>,
|
|
181
|
+
identityToPublicKey: (identity: string) => Uint8Array,
|
|
182
|
+
): void {
|
|
183
|
+
switch (field.type) {
|
|
184
|
+
case 'uint8':
|
|
185
|
+
case 'sint8':
|
|
186
|
+
case 'uint16':
|
|
187
|
+
case 'sint16':
|
|
188
|
+
case 'uint32':
|
|
189
|
+
case 'sint32':
|
|
190
|
+
case 'uint64':
|
|
191
|
+
case 'sint64':
|
|
192
|
+
case 'uint128':
|
|
193
|
+
case 'id':
|
|
194
|
+
writeScalar(field.type, field.name, value, buf, view, offset, identityToPublicKey)
|
|
195
|
+
break
|
|
196
|
+
case 'bytes': {
|
|
197
|
+
if (!(value instanceof Uint8Array))
|
|
198
|
+
throw new PayloadBuildError(`Field "${field.name}": expected Uint8Array`)
|
|
199
|
+
if (value.byteLength !== field.byteLength)
|
|
200
|
+
throw new PayloadBuildError(
|
|
201
|
+
`Field "${field.name}": Uint8Array length ${value.byteLength} !== expected ${field.byteLength}`,
|
|
202
|
+
)
|
|
203
|
+
buf.set(value, offset)
|
|
204
|
+
break
|
|
205
|
+
}
|
|
206
|
+
case 'struct': {
|
|
207
|
+
if (field.structRef === undefined)
|
|
208
|
+
throw new PayloadBuildError(`Field "${field.name}": missing structRef`)
|
|
209
|
+
const namedStruct = structs[field.structRef]
|
|
210
|
+
if (!namedStruct)
|
|
211
|
+
throw new PayloadBuildError(`Field "${field.name}": struct "${field.structRef}" not found`)
|
|
212
|
+
if (
|
|
213
|
+
typeof value !== 'object' ||
|
|
214
|
+
value === null ||
|
|
215
|
+
Array.isArray(value) ||
|
|
216
|
+
value instanceof Uint8Array
|
|
217
|
+
)
|
|
218
|
+
throw new PayloadBuildError(`Field "${field.name}": expected object for struct`)
|
|
219
|
+
const nested = value as DecodedStruct
|
|
220
|
+
for (const sf of namedStruct.fields) {
|
|
221
|
+
const sv = nested[sf.name]
|
|
222
|
+
if (sv === undefined) throw new PayloadBuildError(`Struct field "${sf.name}" missing`)
|
|
223
|
+
encodeField(
|
|
224
|
+
sf,
|
|
225
|
+
sv as FieldValue,
|
|
226
|
+
buf,
|
|
227
|
+
view,
|
|
228
|
+
offset + sf.offset,
|
|
229
|
+
structs,
|
|
230
|
+
identityToPublicKey,
|
|
231
|
+
)
|
|
232
|
+
}
|
|
233
|
+
break
|
|
234
|
+
}
|
|
235
|
+
case 'array': {
|
|
236
|
+
if (!Array.isArray(value))
|
|
237
|
+
throw new PayloadBuildError(`Field "${field.name}": expected array`)
|
|
238
|
+
if (field.arrayItemByteLength === undefined)
|
|
239
|
+
throw new PayloadBuildError(`Field "${field.name}": missing arrayItemByteLength`)
|
|
240
|
+
const itemLen = field.arrayItemByteLength
|
|
241
|
+
const itemType = field.arrayItemType ?? 'uint8'
|
|
242
|
+
for (let i = 0; i < value.length; i++) {
|
|
243
|
+
const itemOffset = offset + i * itemLen
|
|
244
|
+
if (field.arrayItemStructRef !== undefined) {
|
|
245
|
+
const namedStruct = structs[field.arrayItemStructRef]
|
|
246
|
+
if (!namedStruct)
|
|
247
|
+
throw new PayloadBuildError(
|
|
248
|
+
`Field "${field.name}": struct item "${field.arrayItemStructRef}" not found`,
|
|
249
|
+
)
|
|
250
|
+
const itemVal = value[i] as DecodedStruct
|
|
251
|
+
for (const sf of namedStruct.fields) {
|
|
252
|
+
const sv = itemVal[sf.name]
|
|
253
|
+
if (sv === undefined)
|
|
254
|
+
throw new PayloadBuildError(`Array struct field "${sf.name}" missing`)
|
|
255
|
+
encodeField(
|
|
256
|
+
sf,
|
|
257
|
+
sv as FieldValue,
|
|
258
|
+
buf,
|
|
259
|
+
view,
|
|
260
|
+
itemOffset + sf.offset,
|
|
261
|
+
structs,
|
|
262
|
+
identityToPublicKey,
|
|
263
|
+
)
|
|
264
|
+
}
|
|
265
|
+
} else {
|
|
266
|
+
writeScalar(
|
|
267
|
+
itemType,
|
|
268
|
+
field.name,
|
|
269
|
+
value[i] as FieldValue,
|
|
270
|
+
buf,
|
|
271
|
+
view,
|
|
272
|
+
itemOffset,
|
|
273
|
+
identityToPublicKey,
|
|
274
|
+
)
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
break
|
|
278
|
+
}
|
|
279
|
+
default:
|
|
280
|
+
throw new PayloadBuildError(`Unknown field type: ${field.type}`)
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// ── Field decoder ─────────────────────────────────────────────────────────────
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Decodes binary payload bytes into a typed record using registry field descriptors.
|
|
288
|
+
* Mirror of buildPayload — same field dispatch logic, reversed direction.
|
|
289
|
+
*/
|
|
290
|
+
export function decodePayload(
|
|
291
|
+
data: Uint8Array,
|
|
292
|
+
fields: BinaryField[],
|
|
293
|
+
structs: Record<string, NamedStruct>,
|
|
294
|
+
publicKeyToIdentity: (pk: Uint8Array) => string,
|
|
295
|
+
): DecodedStruct {
|
|
296
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength)
|
|
297
|
+
const result: DecodedStruct = {}
|
|
298
|
+
for (const field of fields) {
|
|
299
|
+
result[field.name] = decodeField(field, data, view, field.offset, structs, publicKeyToIdentity)
|
|
300
|
+
}
|
|
301
|
+
return result
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
function decodeField(
|
|
305
|
+
field: BinaryField,
|
|
306
|
+
data: Uint8Array,
|
|
307
|
+
view: DataView,
|
|
308
|
+
offset: number,
|
|
309
|
+
structs: Record<string, NamedStruct>,
|
|
310
|
+
publicKeyToIdentity: (pk: Uint8Array) => string,
|
|
311
|
+
): FieldValue {
|
|
312
|
+
switch (field.type) {
|
|
313
|
+
case 'uint8':
|
|
314
|
+
case 'sint8':
|
|
315
|
+
case 'uint16':
|
|
316
|
+
case 'sint16':
|
|
317
|
+
case 'uint32':
|
|
318
|
+
case 'sint32':
|
|
319
|
+
case 'uint64':
|
|
320
|
+
case 'sint64':
|
|
321
|
+
case 'uint128':
|
|
322
|
+
case 'id':
|
|
323
|
+
return readScalar(field.type, data, view, offset, publicKeyToIdentity)
|
|
324
|
+
case 'bytes':
|
|
325
|
+
return data.slice(offset, offset + field.byteLength)
|
|
326
|
+
case 'struct': {
|
|
327
|
+
if (field.structRef === undefined)
|
|
328
|
+
throw new PayloadBuildError(`Field "${field.name}": missing structRef`)
|
|
329
|
+
const namedStruct = structs[field.structRef]
|
|
330
|
+
if (!namedStruct)
|
|
331
|
+
throw new PayloadBuildError(`Field "${field.name}": struct "${field.structRef}" not found`)
|
|
332
|
+
const nested: DecodedStruct = {}
|
|
333
|
+
for (const sf of namedStruct.fields) {
|
|
334
|
+
nested[sf.name] = decodeField(
|
|
335
|
+
sf,
|
|
336
|
+
data,
|
|
337
|
+
view,
|
|
338
|
+
offset + sf.offset,
|
|
339
|
+
structs,
|
|
340
|
+
publicKeyToIdentity,
|
|
341
|
+
)
|
|
342
|
+
}
|
|
343
|
+
return nested
|
|
344
|
+
}
|
|
345
|
+
case 'array': {
|
|
346
|
+
if (field.arrayLength === undefined)
|
|
347
|
+
throw new PayloadBuildError(`Field "${field.name}": missing arrayLength`)
|
|
348
|
+
const items: FieldValue[] = []
|
|
349
|
+
const itemLen = field.arrayItemByteLength ?? 0
|
|
350
|
+
const itemType = field.arrayItemType ?? 'uint8'
|
|
351
|
+
for (let i = 0; i < field.arrayLength; i++) {
|
|
352
|
+
const itemOffset = offset + i * itemLen
|
|
353
|
+
if (field.arrayItemStructRef !== undefined) {
|
|
354
|
+
const namedStruct = structs[field.arrayItemStructRef]
|
|
355
|
+
if (namedStruct) {
|
|
356
|
+
const nested: DecodedStruct = {}
|
|
357
|
+
for (const sf of namedStruct.fields) {
|
|
358
|
+
nested[sf.name] = decodeField(
|
|
359
|
+
sf,
|
|
360
|
+
data,
|
|
361
|
+
view,
|
|
362
|
+
itemOffset + sf.offset,
|
|
363
|
+
structs,
|
|
364
|
+
publicKeyToIdentity,
|
|
365
|
+
)
|
|
366
|
+
}
|
|
367
|
+
items.push(nested)
|
|
368
|
+
}
|
|
369
|
+
} else {
|
|
370
|
+
items.push(readScalar(itemType, data, view, itemOffset, publicKeyToIdentity))
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return items
|
|
374
|
+
}
|
|
375
|
+
default:
|
|
376
|
+
throw new PayloadBuildError(`Unknown field type: ${field.type}`)
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Builds a payload from an ordered list of typed fields — no registry, no field names.
|
|
382
|
+
* For use with unknown or custom contracts.
|
|
383
|
+
*
|
|
384
|
+
* @example
|
|
385
|
+
* const payload = buildPayloadManual([
|
|
386
|
+
* { type: 'uint64', value: 5_000_000n },
|
|
387
|
+
* { type: 'uint32', value: 150 },
|
|
388
|
+
* ])
|
|
389
|
+
*/
|
|
390
|
+
export function buildPayloadManual(
|
|
391
|
+
fields: ReadonlyArray<{ type: FieldType; value: FieldValue }>,
|
|
392
|
+
): Uint8Array {
|
|
393
|
+
const sizes: Record<string, number> = {
|
|
394
|
+
uint8: 1,
|
|
395
|
+
sint8: 1,
|
|
396
|
+
uint16: 2,
|
|
397
|
+
sint16: 2,
|
|
398
|
+
uint32: 4,
|
|
399
|
+
sint32: 4,
|
|
400
|
+
uint64: 8,
|
|
401
|
+
sint64: 8,
|
|
402
|
+
uint128: 16,
|
|
403
|
+
id: 32,
|
|
404
|
+
}
|
|
405
|
+
let totalSize = 0
|
|
406
|
+
for (const f of fields) {
|
|
407
|
+
if (f.type === 'struct' || f.type === 'array') {
|
|
408
|
+
throw new PayloadBuildError(
|
|
409
|
+
`buildPayloadManual does not support '${f.type}' fields — use buildPayload with a full BinaryField descriptor instead`,
|
|
410
|
+
)
|
|
411
|
+
}
|
|
412
|
+
if (f.type === 'id') {
|
|
413
|
+
throw new PayloadBuildError(
|
|
414
|
+
`buildPayloadManual does not support 'id' fields — use buildPayload with an identityToPublicKey parameter instead`,
|
|
415
|
+
)
|
|
416
|
+
}
|
|
417
|
+
totalSize += f.value instanceof Uint8Array ? f.value.byteLength : (sizes[f.type] ?? 0)
|
|
418
|
+
}
|
|
419
|
+
const buf = new Uint8Array(totalSize)
|
|
420
|
+
const view = new DataView(buf.buffer)
|
|
421
|
+
let offset = 0
|
|
422
|
+
for (const f of fields) {
|
|
423
|
+
if (f.value instanceof Uint8Array) {
|
|
424
|
+
buf.set(f.value, offset)
|
|
425
|
+
offset += f.value.byteLength
|
|
426
|
+
} else {
|
|
427
|
+
const size = sizes[f.type] ?? 0
|
|
428
|
+
writeScalar(f.type, '', f.value, buf, view, offset, () => new Uint8Array(32))
|
|
429
|
+
offset += size
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
return buf
|
|
433
|
+
}
|
package/src/registry.ts
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AbiLookupResult,
|
|
3
|
+
ContractAbiVersion,
|
|
4
|
+
ContractCallBase,
|
|
5
|
+
ContractRegistry,
|
|
6
|
+
} from './types.js'
|
|
7
|
+
|
|
8
|
+
export class AbiNotFoundError extends Error {
|
|
9
|
+
constructor(
|
|
10
|
+
readonly contractIndex: number,
|
|
11
|
+
readonly epoch: number,
|
|
12
|
+
options?: { cause?: unknown },
|
|
13
|
+
) {
|
|
14
|
+
super(`No ABI found for contract ${contractIndex} at epoch ${epoch}`, {
|
|
15
|
+
cause: options?.cause,
|
|
16
|
+
})
|
|
17
|
+
this.name = 'AbiNotFoundError'
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export class EntryNotFoundError extends AbiNotFoundError {
|
|
22
|
+
constructor(
|
|
23
|
+
readonly kind: 'procedure' | 'function',
|
|
24
|
+
readonly contractName: string,
|
|
25
|
+
readonly inputType: number,
|
|
26
|
+
) {
|
|
27
|
+
super(-1, -1)
|
|
28
|
+
this.message = `${kind} inputType ${inputType} not found in contract ${contractName}`
|
|
29
|
+
this.name = 'EntryNotFoundError'
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Returns the ABI version active at the given epoch for the given contract.
|
|
35
|
+
* @throws {AbiNotFoundError} if no version covers the epoch.
|
|
36
|
+
*/
|
|
37
|
+
export function getAbi(
|
|
38
|
+
registry: ContractRegistry,
|
|
39
|
+
contractIndex: number,
|
|
40
|
+
epoch: number,
|
|
41
|
+
): AbiLookupResult {
|
|
42
|
+
const versions = registry.versions.filter((v) => v.contractIndex === contractIndex)
|
|
43
|
+
const version = versions.find(
|
|
44
|
+
(v) =>
|
|
45
|
+
v.effectiveFromEpoch <= epoch && epoch <= (v.effectiveToEpoch ?? Number.POSITIVE_INFINITY),
|
|
46
|
+
)
|
|
47
|
+
if (!version) throw new AbiNotFoundError(contractIndex, epoch)
|
|
48
|
+
const maxFrom = versions.reduce((m, v) => Math.max(m, v.effectiveFromEpoch), 0)
|
|
49
|
+
const isCurrent = version.effectiveToEpoch === null
|
|
50
|
+
return {
|
|
51
|
+
version,
|
|
52
|
+
isCurrent,
|
|
53
|
+
isRegistryPossiblyStale: isCurrent && epoch > maxFrom,
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Returns all ABI versions for a contract, sorted by effectiveFromEpoch ASC.
|
|
59
|
+
*/
|
|
60
|
+
export function getAbiHistory(
|
|
61
|
+
registry: ContractRegistry,
|
|
62
|
+
contractIndex: number,
|
|
63
|
+
): ContractAbiVersion[] {
|
|
64
|
+
return registry.versions
|
|
65
|
+
.filter((v) => v.contractIndex === contractIndex)
|
|
66
|
+
.sort((a, b) => a.effectiveFromEpoch - b.effectiveFromEpoch)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Returns the currently-active ABI version (effectiveToEpoch === null).
|
|
71
|
+
* @throws {AbiNotFoundError} if none exists.
|
|
72
|
+
*/
|
|
73
|
+
export function getCurrentAbi(
|
|
74
|
+
registry: ContractRegistry,
|
|
75
|
+
contractIndex: number,
|
|
76
|
+
): ContractAbiVersion {
|
|
77
|
+
const version = registry.versions.find(
|
|
78
|
+
(v) => v.contractIndex === contractIndex && v.effectiveToEpoch === null,
|
|
79
|
+
)
|
|
80
|
+
if (!version) throw new AbiNotFoundError(contractIndex, -1)
|
|
81
|
+
return version
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Finds a procedure by inputType ordinal.
|
|
86
|
+
* @throws if not found.
|
|
87
|
+
*/
|
|
88
|
+
export function getProcedure(version: ContractAbiVersion, inputType: number): ContractCallBase {
|
|
89
|
+
const proc = version.procedures.find((p) => p.inputType === inputType)
|
|
90
|
+
if (!proc) throw new EntryNotFoundError('procedure', version.contractName, inputType)
|
|
91
|
+
return proc
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Finds a function by inputType ordinal.
|
|
96
|
+
* @throws {EntryNotFoundError} if not found.
|
|
97
|
+
*/
|
|
98
|
+
export function getFunction(version: ContractAbiVersion, inputType: number): ContractCallBase {
|
|
99
|
+
const fn = version.functions.find((f) => f.inputType === inputType)
|
|
100
|
+
if (!fn) throw new EntryNotFoundError('function', version.contractName, inputType)
|
|
101
|
+
return fn
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Returns the contract name for a given index.
|
|
106
|
+
* @throws if the index is not registered.
|
|
107
|
+
*/
|
|
108
|
+
export function findContractByIndex(registry: ContractRegistry, contractIndex: number): string {
|
|
109
|
+
const version = registry.versions.find((v) => v.contractIndex === contractIndex)
|
|
110
|
+
if (!version) throw new Error(`Contract index ${contractIndex} not found in registry`)
|
|
111
|
+
return version.contractName
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Returns the contract index for a given name (case-insensitive).
|
|
116
|
+
* @throws if not found.
|
|
117
|
+
*/
|
|
118
|
+
export function findContractByName(registry: ContractRegistry, name: string): number {
|
|
119
|
+
const lower = name.toLowerCase()
|
|
120
|
+
const version = registry.versions.find((v) => v.contractName.toLowerCase() === lower)
|
|
121
|
+
if (!version) throw new Error(`Contract name "${name}" not found in registry`)
|
|
122
|
+
return version.contractIndex
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Validates the registry for structural correctness.
|
|
127
|
+
* @throws with a descriptive message on any inconsistency.
|
|
128
|
+
*/
|
|
129
|
+
export function validateRegistry(registry: ContractRegistry): void {
|
|
130
|
+
const byContract = new Map<number, ContractAbiVersion[]>()
|
|
131
|
+
for (const v of registry.versions) {
|
|
132
|
+
const list = byContract.get(v.contractIndex) ?? []
|
|
133
|
+
list.push(v)
|
|
134
|
+
byContract.set(v.contractIndex, list)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
for (const [contractIndex, versions] of byContract) {
|
|
138
|
+
const currentVersions = versions.filter((v) => v.effectiveToEpoch === null)
|
|
139
|
+
if (currentVersions.length > 1) {
|
|
140
|
+
throw new Error(
|
|
141
|
+
`Contract ${contractIndex} has multiple current versions (effectiveToEpoch === null)`,
|
|
142
|
+
)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const sorted = [...versions].sort((a, b) => a.effectiveFromEpoch - b.effectiveFromEpoch)
|
|
146
|
+
for (let i = 0; i < sorted.length - 1; i++) {
|
|
147
|
+
const a = sorted[i]
|
|
148
|
+
const b = sorted[i + 1]
|
|
149
|
+
if (a === undefined || b === undefined) continue
|
|
150
|
+
const aEnd = a.effectiveToEpoch ?? Number.POSITIVE_INFINITY
|
|
151
|
+
if (aEnd >= b.effectiveFromEpoch) {
|
|
152
|
+
throw new Error(
|
|
153
|
+
`Contract ${contractIndex} has overlapping epoch ranges: [${a.effectiveFromEpoch}, ${a.effectiveToEpoch}] and [${b.effectiveFromEpoch}, ${b.effectiveToEpoch}]`,
|
|
154
|
+
)
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
for (const v of versions) {
|
|
159
|
+
validateVersion(v)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function validateVersion(v: ContractAbiVersion): void {
|
|
165
|
+
for (const call of [...v.procedures, ...v.functions]) {
|
|
166
|
+
const inputSum = call.inputFields.reduce((s, f) => s + f.byteLength, 0)
|
|
167
|
+
if (inputSum !== call.inputSize) {
|
|
168
|
+
throw new Error(
|
|
169
|
+
`Contract ${v.contractName} ${call.kind} "${call.name}": inputSize ${call.inputSize} !== sum of inputField byteLengths ${inputSum}`,
|
|
170
|
+
)
|
|
171
|
+
}
|
|
172
|
+
const outputSum = call.outputFields.reduce((s, f) => s + f.byteLength, 0)
|
|
173
|
+
if (outputSum !== call.outputSize) {
|
|
174
|
+
throw new Error(
|
|
175
|
+
`Contract ${v.contractName} ${call.kind} "${call.name}": outputSize ${call.outputSize} !== sum of outputField byteLengths ${outputSum}`,
|
|
176
|
+
)
|
|
177
|
+
}
|
|
178
|
+
for (const field of [...call.inputFields, ...call.outputFields]) {
|
|
179
|
+
validateField(field, v)
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function validateField(field: import('./types.js').BinaryField, v: ContractAbiVersion): void {
|
|
185
|
+
if (field.type === 'array') {
|
|
186
|
+
const len = field.arrayLength ?? 0
|
|
187
|
+
const itemLen = field.arrayItemByteLength ?? 0
|
|
188
|
+
if (len * itemLen !== field.byteLength) {
|
|
189
|
+
throw new Error(
|
|
190
|
+
`Contract ${v.contractName} field "${field.name}": arrayLength × arrayItemByteLength !== byteLength`,
|
|
191
|
+
)
|
|
192
|
+
}
|
|
193
|
+
if (field.arrayItemStructRef !== undefined && !(field.arrayItemStructRef in v.structs)) {
|
|
194
|
+
throw new Error(
|
|
195
|
+
`Contract ${v.contractName} field "${field.name}": arrayItemStructRef "${field.arrayItemStructRef}" not found in structs`,
|
|
196
|
+
)
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (field.type === 'struct' && field.structRef !== undefined && !(field.structRef in v.structs)) {
|
|
200
|
+
throw new Error(
|
|
201
|
+
`Contract ${v.contractName} field "${field.name}": structRef "${field.structRef}" not found in structs`,
|
|
202
|
+
)
|
|
203
|
+
}
|
|
204
|
+
}
|