From 060386ccaebe2847a93c1e9d8fc8b6c9dee1b20d Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 24 May 2023 18:01:39 +0500 Subject: [PATCH 001/143] treasury.ride + test --- .env | 3 + .eslintrc.yml | 10 + .gitignore | 3 + .mocharc.yaml | 4 + contracts/treasury/test/setup.js | 66 + contracts/treasury/test/vote_for_tx.spec.js | 91 + contracts/treasury/treasury.ride | 127 + package.json | 31 + pnpm-lock.yaml | 2402 +++++++++++++++++++ utils/api.js | 51 + 10 files changed, 2788 insertions(+) create mode 100644 .env create mode 100644 .eslintrc.yml create mode 100644 .gitignore create mode 100644 .mocharc.yaml create mode 100644 contracts/treasury/test/setup.js create mode 100644 contracts/treasury/test/vote_for_tx.spec.js create mode 100644 contracts/treasury/treasury.ride create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 utils/api.js diff --git a/.env b/.env new file mode 100644 index 0000000..89bedb1 --- /dev/null +++ b/.env @@ -0,0 +1,3 @@ +API_NODE_URL=http://localhost:6869 +CHAIN_ID=R +BASE_SEED=waves private node seed with waves tokens diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000..ac6a3ee --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,10 @@ +env: + es2021: true + node: true + mocha: true +extends: standard +overrides: [] +parserOptions: + ecmaVersion: latest + sourceType: module +rules: {} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..02960a4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +.idea +.vscode diff --git a/.mocharc.yaml b/.mocharc.yaml new file mode 100644 index 0000000..4483d24 --- /dev/null +++ b/.mocharc.yaml @@ -0,0 +1,4 @@ +parallel: true +timeout: 5m +spec: + - 'contracts/**/*.spec.js' diff --git a/contracts/treasury/test/setup.js b/contracts/treasury/test/setup.js new file mode 100644 index 0000000..ba86433 --- /dev/null +++ b/contracts/treasury/test/setup.js @@ -0,0 +1,66 @@ +import wc from '@waves/ts-lib-crypto' +import { + data, + massTransfer +} from '@waves/waves-transactions' +import { format } from 'path' +import { table, getBorderCharacters } from 'table' + +import { + chainId, broadcastAndWait, baseSeed, setScriptFromFile +} from '../../../utils/api.js' + +const nonceLength = 3 +const ridePath = 'contracts/treasury' +const treasuryPath = format({ dir: ridePath, base: 'treasury.ride' }) + +export const setupAccounts = async () => { + const nonce = wc.random(nonceLength, 'Buffer').toString('hex') + const names = [ + 'treasury', + 'admin1', + 'admin2', + 'admin3', + 'user1' + ] + const accounts = Object.fromEntries(names.map((item) => { + const seed = `${item}#${nonce}` + return [item, { seed, address: wc.address(seed, chainId), publicKey: wc.publicKey(seed) }] + })) + const amount = 100e8 + const massTransferTx = massTransfer({ + transfers: Object.values(accounts).map(({ address }) => ({ recipient: address, amount })), + chainId + }, baseSeed) + await broadcastAndWait(massTransferTx) + + await setScriptFromFile(treasuryPath, accounts.treasury.seed) + + const adminsListString = [ + accounts.admin1.address, + accounts.admin2.address, + accounts.admin3.address + ].join('__') + const setAdminsTx = data({ + additionalFee: 4e5, + data: [ + { + key: '%s__adminAddressList', + type: 'string', + value: adminsListString + } + ], + chainId + }, accounts.treasury.seed) + await broadcastAndWait(setAdminsTx) + + const accountsInfo = Object.entries(accounts) + .map(([name, { seed, address }]) => [name, address]) + console.log(table(accountsInfo, { + border: getBorderCharacters('norc'), + drawHorizontalLine: (index, size) => index === 0 || index === 1 || index === size, + header: { content: `pid: ${process.pid}, nonce: ${nonce}` } + })) + + return accounts +} diff --git a/contracts/treasury/test/vote_for_tx.spec.js b/contracts/treasury/test/vote_for_tx.spec.js new file mode 100644 index 0000000..c1f4f40 --- /dev/null +++ b/contracts/treasury/test/vote_for_tx.spec.js @@ -0,0 +1,91 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { invokeScript, data } from '@waves/waves-transactions' +import { api, broadcastAndWait, chainId } from '../../../utils/api.js' +import { setupAccounts } from './setup.js' + +chai.use(chaiAsPromised) +const { expect } = chai + +describe(`[${process.pid}] treasury: vote for allowed tx`, () => { + let dataTx, treasury, accounts + + before(async () => { + accounts = await setupAccounts() + treasury = accounts.treasury.address + dataTx = data( + { + additionalFee: 4e5, + data: [{ key: 'foo', type: 'string', value: 'bar' }], + chainId + }, + accounts.treasury.seed + ) + }) + + it('tx should be rejected before vote for allowed txid', async () => { + return expect(api.transactions.broadcast(dataTx)).to.be.rejectedWith('tx is not allowed') + }) + + it('first vote should increment votes count', async () => { + const vote1tx = invokeScript( + { + dApp: treasury, + call: { + function: 'voteForTxId', + args: [{ type: 'string', value: dataTx.id }] + }, + chainId + }, + accounts.admin1.seed + ) + const vote1 = await broadcastAndWait(vote1tx) + + expect(vote1.stateChanges.data).to.eql([ + { + key: `%s%s%s__allowTxId__${dataTx.id}__${accounts.admin1.address}`, + type: 'integer', + value: 1 + } + ]) + }) + + it('second vote should approve tx and remove voting data', async () => { + const vote2tx = invokeScript( + { + dApp: treasury, + call: { + function: 'voteForTxId', + args: [{ type: 'string', value: dataTx.id }] + }, + chainId + }, + accounts.admin3.seed + ) + const vote2 = await broadcastAndWait(vote2tx) + + expect(vote2.stateChanges.data).to.eql([ + { + key: `%s%s%s__allowTxId__${dataTx.id}__${accounts.admin1.address}`, + value: null + }, + { + key: `%s%s%s__allowTxId__${dataTx.id}__${accounts.admin2.address}`, + value: null + }, + { + key: `%s%s%s__allowTxId__${dataTx.id}__${accounts.admin3.address}`, + value: null + }, + { + key: '%s__txId', + type: 'string', + value: dataTx.id + } + ]) + }) + + it('tx should be allowed after vote for allowed txid', async () => { + return expect(broadcastAndWait(dataTx)).to.be.fulfilled + }) +}) diff --git a/contracts/treasury/treasury.ride b/contracts/treasury/treasury.ride new file mode 100644 index 0000000..e420ad6 --- /dev/null +++ b/contracts/treasury/treasury.ride @@ -0,0 +1,127 @@ +{-# STDLIB_VERSION 6 #-} +{-# CONTENT_TYPE DAPP #-} +{-# SCRIPT_TYPE ACCOUNT #-} + +let SEP = "__" +let contractFilename = "treasury.ride" +let ADMIN_LIST_SIZE = 3 +let QUORUM = 2 +let ADDRESS_BYTES_LENGTH = 26 +let TXID_BYTES_LENGTH = 32 + +func wrapErr(s: String) = { + contractFilename + ": " + s +} + +func throwErr(s: String) = { + throw(wrapErr(s)) +} + +func keyAllowedTxIdVotePrefix(txId: String) = makeString(["%s%s%s", "allowTxId", txId], SEP) + +# Make Admin vote key +func keyFullAdminVote(prefix: String, adminAddress: String) = makeString([prefix, adminAddress], SEP) + +# Admin List key +func keyAdminAddressList() = makeString(["%s", "adminAddressList"], SEP) + +# Allowed TXID key +func keyAllowedTxId() = makeString(["%s", "txId"], SEP) + +func getAdminVote(prefix: String, admin: String) = { + let voteKey = keyFullAdminVote(prefix, admin) + getInteger(voteKey).valueOrElse(0) +} + +func getAdminsList() = { + match (this.getString(keyAdminAddressList())) { + case s:String => s.split(SEP) + case _ => [] + } +} + +func isInAdminList(address: String) = { + getAdminsList().containsElement(address) +} + +# Generate List of keys with same prefix for all admins +func genVotesKeysHelper(a: (List[String], String), adminAddress: String) = { + let (result, prefix) = a + (result :+ keyFullAdminVote(prefix, adminAddress), prefix) +} +func genVotesKeys(keyPrefix: String) = { + let adminList = keyAdminAddressList() + let (result, prefix) = FOLD<3>(getAdminsList(), ([], keyPrefix), genVotesKeysHelper) + result +} + +# Count all votes for Prefix +func countVotesHelper(result: Int, voteKey: String) = { + result + getInteger(voteKey).valueOrElse(0) +} +func countVotes(prefix: String) = { + let votes = genVotesKeys(prefix) + FOLD<3>(votes, 0, countVotesHelper) +} + +# Generate DeleteEntry for all votes with Prefix +func clearVotesHelper(result: List[DeleteEntry], key: String) = { + result :+ DeleteEntry(key) +} +func getClearVoteEntries(prefix: String) = { + let votes = genVotesKeys(prefix) + FOLD<3>(votes, [], clearVotesHelper) +} + +func voteINTERNAL( + callerAddressString: String, + keyPrefix: String, + minVotes: Int, + voteResult: List[StringEntry|IntegerEntry|DeleteEntry] +) = { + let voteKey = keyFullAdminVote(keyPrefix, callerAddressString) + let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString) + + strict err = if (!isInAdminList(callerAddressString)) then { + throwErr("Address: " + callerAddressString + " not in Admin list") + } else if (adminCurrentVote == 1) then { + throwErr(voteKey + " you already voted") + } else { unit } + + let votes = countVotes(keyPrefix) + if (votes + 1 >= minVotes) then { + let clearVoteEntries = getClearVoteEntries(keyPrefix) + clearVoteEntries ++ voteResult + } else { + [ IntegerEntry(voteKey, 1) ] + } +} + +# Vote for txId that is allowed in Verifier (quorum: 2 votes) +@Callable(i) +func voteForTxId(txId: String) = { + let callerAddressString = toBase58String(i.caller.bytes) + let keyPrefix = keyAllowedTxIdVotePrefix(txId) + let result = [ StringEntry(keyAllowedTxId(), txId) ] + + strict err = if (txId.fromBase58String().size() != TXID_BYTES_LENGTH) then { + throwErr(txId + " is not valid txId") + } else { + unit + } + + voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result) +} + +@Verifier(tx) +func verify() = { + let allowedTxId = getString(keyAllowedTxId()) + .valueOrErrorMessage(wrapErr("tx is not allowed")) + .fromBase58String() + let currentAdminList = getAdminsList() + if (currentAdminList.size() == ADMIN_LIST_SIZE) then { + (tx.id == allowedTxId) + } else { + sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e14af2f --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "waves-dao-ride", + "type": "module", + "version": "1.0.0", + "description": "", + "scripts": { + "test": "mocha -r dotenv/config" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@waves/node-api-js": "^1.3.0", + "@waves/ride-js": "^2.2.5", + "@waves/ts-lib-crypto": "1.4.4-beta.1", + "@waves/waves-transactions": "^4.2.10", + "chai": "^4.3.7", + "chai-as-promised": "^7.1.1", + "concurrently": "^8.0.1", + "dotenv": "^16.0.3", + "mocha": "^10.2.0", + "table": "^6.8.1" + }, + "devDependencies": { + "eslint": "^8.41.0", + "eslint-config-standard": "^17.0.0", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0", + "eslint-plugin-promise": "^6.0.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..000ef3d --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2402 @@ +lockfileVersion: '6.0' + +dependencies: + '@waves/node-api-js': + specifier: ^1.3.0 + version: 1.3.0 + '@waves/ride-js': + specifier: ^2.2.5 + version: 2.2.5 + '@waves/ts-lib-crypto': + specifier: 1.4.4-beta.1 + version: 1.4.4-beta.1 + '@waves/waves-transactions': + specifier: ^4.2.10 + version: 4.2.10 + chai: + specifier: ^4.3.7 + version: 4.3.7 + chai-as-promised: + specifier: ^7.1.1 + version: 7.1.1(chai@4.3.7) + concurrently: + specifier: ^8.0.1 + version: 8.0.1 + dotenv: + specifier: ^16.0.3 + version: 16.0.3 + mocha: + specifier: ^10.2.0 + version: 10.2.0 + table: + specifier: ^6.8.1 + version: 6.8.1 + +devDependencies: + eslint: + specifier: ^8.41.0 + version: 8.41.0 + eslint-config-standard: + specifier: ^17.0.0 + version: 17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.41.0) + eslint-plugin-import: + specifier: ^2.25.2 + version: 2.27.5(eslint@8.41.0) + eslint-plugin-n: + specifier: ^15.0.0 + version: 15.7.0(eslint@8.41.0) + eslint-plugin-promise: + specifier: ^6.0.0 + version: 6.1.1(eslint@8.41.0) + +packages: + + /@babel/code-frame@7.21.4: + resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: false + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/highlight@7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: false + + /@babel/runtime@7.21.5: + resolution: {integrity: sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: false + + /@eslint-community/eslint-utils@4.4.0(eslint@8.41.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.41.0 + eslint-visitor-keys: 3.4.1 + dev: true + + /@eslint-community/regexpp@4.5.1: + resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.0.3: + resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 9.5.2 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.41.0: + resolution: {integrity: sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array@0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@jest/environment@27.5.1: + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.2.3 + jest-mock: 27.5.1 + dev: false + + /@jest/fake-timers@27.5.1: + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@sinonjs/fake-timers': 8.1.0 + '@types/node': 20.2.3 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: false + + /@jest/globals@27.5.1: + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/types': 27.5.1 + expect: 27.5.1 + dev: false + + /@jest/types@27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 20.2.3 + '@types/yargs': 16.0.5 + chalk: 4.1.2 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: false + + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: false + + /@sinonjs/fake-timers@8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: false + + /@types/base64-js@1.3.0: + resolution: {integrity: sha512-ZmI0sZGAUNXUfMWboWwi4LcfpoVUYldyN6Oe0oJ5cCsHDU/LlRq8nQKPXhYLOx36QYSW9bNIb1vvRrD6K7Llgw==} + dev: false + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: false + + /@types/istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: false + + /@types/istanbul-reports@3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: false + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node-fetch@2.6.4: + resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} + dependencies: + '@types/node': 20.2.3 + form-data: 3.0.1 + dev: false + + /@types/node@20.2.3: + resolution: {integrity: sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==} + dev: false + + /@types/stack-utils@2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: false + + /@types/yargs-parser@21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: false + + /@types/yargs@16.0.5: + resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: false + + /@waves/bignumber@1.1.1: + resolution: {integrity: sha512-WUY0R0y0Rd92nbyQHbIFDXCWh2YMtf5FYtpoTv4yRomM75cRLJ0/NIQ828guUXLKeVytKzWgvDYj1CZfxatDkg==} + dependencies: + bignumber.js: 9.1.1 + dev: false + + /@waves/marshall@0.15.0-beta.1: + resolution: {integrity: sha512-3OoyDJ6tSAkEwSVIIO4wjtGUDMz0Jfs+PpSX41Gzp5+9PL5Q5xCR06idBDMhTBdqgm/xzndY++l4d8SMSFjGKw==} + dependencies: + '@types/base64-js': 1.3.0 + '@types/long': 4.0.2 + '@waves/parse-json-bignumber': 1.0.3 + base64-js: 1.5.1 + long: 4.0.0 + dev: false + + /@waves/node-api-js@1.3.0: + resolution: {integrity: sha512-FEI42KM1C6hE541kexV/eqWDeBrVxeMswZbHQ9kRlFdso/kKmouhhjV73NI/zFCSwMzbFI4YDe2ElOSim0DyEA==} + dependencies: + '@types/node-fetch': 2.6.4 + '@waves/bignumber': 1.1.1 + '@waves/ts-types': 1.1.0 + node-fetch: 2.6.11 + typed-ts-events: 1.2.1 + transitivePeerDependencies: + - encoding + dev: false + + /@waves/parse-json-bignumber@1.0.3: + resolution: {integrity: sha512-zBHIQUjjMYMQXNQcwJwzNShUZnoTM6JfVJDwa0eDGUVk+JAKVGiXxv/k29Ng9TsIDi97hwVravlPPwfZcy4XXQ==} + dev: false + + /@waves/protobuf-serialization@1.4.3: + resolution: {integrity: sha512-qloPEDn9FsiZWLX8y7CWQXXxX+RGq1zPN5AaYmOBrrZ5Z8EA4hoTVINkQFpl2VbfSpRjI5XpwsxbkL3QhgCodw==} + dependencies: + '@types/long': 4.0.2 + protobufjs: 6.11.3 + dev: false + + /@waves/ride-js@2.2.5: + resolution: {integrity: sha512-rmHdnv2sfZKrm9UmhH0TyyJHxXUWcD28Xny4lvHTNLg+Ziwc7yfpKQaHfFPc7ZEUAn9WJcqeUegg7e1NZ1KmTw==} + dependencies: + '@jest/globals': 27.5.1 + '@waves/ts-lib-crypto': 1.4.3 + axios: 0.19.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@waves/ts-lib-crypto@1.4.3: + resolution: {integrity: sha512-2pKgyvtLapgM5vpaUEYzX7NYe2bkB+HdWn9W/4d7UFKwyg6zoOYhRQWyb6GuLi3OLHTETgiqpcMZvciFA0Ds6g==} + dependencies: + js-sha3: 0.8.0 + node-forge: 0.8.5 + dev: false + + /@waves/ts-lib-crypto@1.4.4-beta.1: + resolution: {integrity: sha512-tlvThkMCoCDicOznW82wDZWQqfAWcm6ulQnuNzR++X9o0EOHM3Cj8LlS2pkgF0YjZrqEYHTp/4e0RXXYVY+dpw==} + dependencies: + js-sha3: 0.8.0 + node-forge: 0.10.0 + dev: false + + /@waves/ts-types@1.1.0: + resolution: {integrity: sha512-SGHj4cIIvMAhDPiDhbpEzP2UqNF3VgTssGf6UaJ7vwzxq0W1pqz2lKMDe9pZup9p9rEETGW4Yy3+K1G7OGOLxA==} + dev: false + + /@waves/waves-transactions@4.2.10: + resolution: {integrity: sha512-sXhZ9XLPK21SAW0s8d92hIh9YwcZy2jMD3wGIbnrmZzLjowPWsFZ0CA1x6fCSMIA9O8jFgq0TUHDvZEgg98Bng==} + dependencies: + '@waves/marshall': 0.15.0-beta.1 + '@waves/node-api-js': 1.3.0 + '@waves/protobuf-serialization': 1.4.3 + '@waves/ts-lib-crypto': 1.4.3 + '@waves/ts-types': 1.1.0 + axios: 0.19.2 + long: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /acorn-jsx@5.3.2(acorn@8.8.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.2 + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + + /array-includes@3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + get-intrinsic: 1.2.1 + is-string: 1.0.7 + dev: true + + /array.prototype.flat@1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap@1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + es-shim-unscopables: 1.0.0 + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: false + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /axios@0.19.2: + resolution: {integrity: sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==} + deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410 + dependencies: + follow-redirects: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /bignumber.js@9.1.1: + resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + + /browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + dev: false + + /builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.5.1 + dev: true + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: false + + /chai-as-promised@7.1.1(chai@4.3.7): + resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + peerDependencies: + chai: '>= 2.1.2 < 5' + dependencies: + chai: 4.3.7 + check-error: 1.0.2 + dev: false + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: false + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + + /concurrently@8.0.1: + resolution: {integrity: sha512-Sh8bGQMEL0TAmAm2meAXMjcASHZa7V0xXQVDBLknCPa9TPtkY9yYs+0cnGGgfdkW0SV1Mlg+hVGfXcoI8d3MJA==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.1 + spawn-command: 0.0.2-1 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.21.5 + dev: false + + /debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.3.4(supports-color@8.1.1): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 8.1.1 + + /decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + dev: false + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /diff-sequences@27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: false + + /diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + dev: false + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /es-abstract@1.21.2: + resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.10 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.9 + dev: true + + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: false + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /eslint-config-standard@17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.41.0): + resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} + peerDependencies: + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: ^15.0.0 + eslint-plugin-promise: ^6.0.0 + dependencies: + eslint: 8.41.0 + eslint-plugin-import: 2.27.5(eslint@8.41.0) + eslint-plugin-n: 15.7.0(eslint@8.41.0) + eslint-plugin-promise: 6.1.1(eslint@8.41.0) + dev: true + + /eslint-import-resolver-node@0.3.7: + resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + dependencies: + debug: 3.2.7 + is-core-module: 2.12.1 + resolve: 1.22.2 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.0(eslint-import-resolver-node@0.3.7)(eslint@8.41.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + debug: 3.2.7 + eslint: 8.41.0 + eslint-import-resolver-node: 0.3.7 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-es@4.1.0(eslint@8.41.0): + resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + eslint: 8.41.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + dev: true + + /eslint-plugin-import@2.27.5(eslint@8.41.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.41.0 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.8.0(eslint-import-resolver-node@0.3.7)(eslint@8.41.0) + has: 1.0.3 + is-core-module: 2.12.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.2 + semver: 6.3.0 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-n@15.7.0(eslint@8.41.0): + resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} + engines: {node: '>=12.22.0'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + builtins: 5.0.1 + eslint: 8.41.0 + eslint-plugin-es: 4.1.0(eslint@8.41.0) + eslint-utils: 3.0.0(eslint@8.41.0) + ignore: 5.2.4 + is-core-module: 2.12.1 + minimatch: 3.1.2 + resolve: 1.22.2 + semver: 7.5.1 + dev: true + + /eslint-plugin-promise@6.1.1(eslint@8.41.0): + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.41.0 + dev: true + + /eslint-scope@7.2.0: + resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-utils@3.0.0(eslint@8.41.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.41.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + + /eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys@3.4.1: + resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.41.0: + resolution: {integrity: sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.41.0) + '@eslint-community/regexpp': 4.5.1 + '@eslint/eslintrc': 2.0.3 + '@eslint/js': 8.41.0 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.0 + eslint-visitor-keys: 3.4.1 + espree: 9.5.2 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + graphemer: 1.4.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.5.2: + resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) + eslint-visitor-keys: 3.4.1 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /expect@27.5.1: + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-get-type: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + dev: false + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /follow-redirects@1.5.10: + resolution: {integrity: sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==} + engines: {node: '>=4.0'} + dependencies: + debug: 3.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: false + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.1 + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: false + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.10 + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + dependencies: + has: 1.0.3 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: false + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: false + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /jest-diff@27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: false + + /jest-get-type@27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: false + + /jest-matcher-utils@27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: false + + /jest-message-util@27.5.1: + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/code-frame': 7.21.4 + '@jest/types': 27.5.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: false + + /jest-mock@27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 20.2.3 + dev: false + + /jest-util@27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 20.2.3 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: false + + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mocha@10.2.0: + resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} + engines: {node: '>= 14.0.0'} + hasBin: true + dependencies: + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.3 + debug: 4.3.4(supports-color@8.1.1) + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 7.2.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.0.1 + ms: 2.1.3 + nanoid: 3.3.3 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.2.1 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + dev: false + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /nanoid@3.3.3: + resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /node-fetch@2.6.11: + resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-forge@0.10.0: + resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} + engines: {node: '>= 6.0.0'} + dev: false + + /node-forge@0.8.5: + resolution: {integrity: sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==} + engines: {node: '>= 4.5.0'} + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.values@1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /optionator@0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: false + + /protobufjs@6.11.3: + resolution: {integrity: sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==} + hasBin: true + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/long': 4.0.2 + '@types/node': 20.2.3 + long: 4.0.0 + dev: false + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: false + + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: true + + /regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.0 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.5.2 + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-regex: 1.1.4 + dev: true + + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver@7.5.1: + resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + dependencies: + randombytes: 2.1.0 + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: false + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: false + + /spawn-command@0.0.2-1: + resolution: {integrity: sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=} + dev: false + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: false + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /table@6.8.1: + resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.12.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: false + + /tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@2.5.2: + resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: false + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.10 + dev: true + + /typed-ts-events@1.2.1: + resolution: {integrity: sha512-+Fy9cqWA/Kv1QX0k6m5ZflGcG2jQSZQGr+jLGXYUM22yihhkHs243LEXvY4cs54lAVyj5gokm0TbgkmL4qDsTg==} + dev: false + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-typed-array@1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + is-typed-array: 1.1.10 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /word-wrap@1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + + /workerpool@6.2.1: + resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + dev: false + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.4 + dev: false + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} diff --git a/utils/api.js b/utils/api.js new file mode 100644 index 0000000..9ee670c --- /dev/null +++ b/utils/api.js @@ -0,0 +1,51 @@ +import { create } from '@waves/node-api-js' +import { nodeInteraction, setScript } from '@waves/waves-transactions' +import ride from '@waves/ride-js' + +import { readFile } from 'fs/promises' + +export const { API_NODE_URL: apiBase, CHAIN_ID: chainId, BASE_SEED: baseSeed } = process.env + +export const api = create(apiBase) +export const largeNumbeConvertHeader = { headers: { Accept: 'application/json;large-significand-format=string' } } + +export const separator = '__' + +export const broadcastAndWait = async (tx) => { + await api.transactions.broadcast(tx, {}) + await nodeInteraction.waitForTx(tx.id, { apiBase }) + return api.transactions.fetchInfo(tx.id) +} + +export const waitForTx = (txId) => nodeInteraction.waitForTx(txId, { apiBase }) + +export const waitForHeight = (height) => nodeInteraction.waitForHeight(height, { apiBase }) + +export const waitNBlocks = (blocksCount) => nodeInteraction.waitNBlocks(blocksCount, { apiBase }) + +/** + * @param {string} path + * @param {string} account + * @param {function(*): *} transform + */ +export const setScriptFromFile = async ( + path, + account, + transform = (content) => content +) => { + const { base64, size } = ride.compile(transform(await readFile(path, { encoding: 'utf-8' }))).result + const waveletsPerKilobyte = 1e5 + const bitsInByte = 1024 + const min = 1000000 + let fee = Math.ceil(size / bitsInByte) * waveletsPerKilobyte + if (fee < min) { + fee = min + } + fee += 4e5 + const ssTx = setScript({ + script: base64, + chainId, + fee + }, account) + await broadcastAndWait(ssTx) +} From 0815c17da471ed2396bd97b1facef0661051b730 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 24 May 2023 19:39:36 +0500 Subject: [PATCH 002/143] proposalAllowBroadcast --- contracts/treasury/test/setup.js | 26 ++++++++++++++++++++++++++ contracts/treasury/treasury.ride | 13 ++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/contracts/treasury/test/setup.js b/contracts/treasury/test/setup.js index ba86433..9601cdd 100644 --- a/contracts/treasury/test/setup.js +++ b/contracts/treasury/test/setup.js @@ -17,6 +17,8 @@ const treasuryPath = format({ dir: ridePath, base: 'treasury.ride' }) export const setupAccounts = async () => { const nonce = wc.random(nonceLength, 'Buffer').toString('hex') const names = [ + 'config', + 'votingResult', 'treasury', 'admin1', 'admin2', @@ -36,6 +38,30 @@ export const setupAccounts = async () => { await setScriptFromFile(treasuryPath, accounts.treasury.seed) + await broadcastAndWait(data({ + additionalFee: 4e5, + data: [ + { + key: '%s__config', + type: 'string', + value: accounts.config.address + } + ], + chainId + }, accounts.treasury.seed)) + + await broadcastAndWait(data({ + additionalFee: 4e5, + data: [ + { + key: 'contract_voting_result', + type: 'string', + value: accounts.votingResult.address + } + ], + chainId + }, accounts.config.seed)) + const adminsListString = [ accounts.admin1.address, accounts.admin2.address, diff --git a/contracts/treasury/treasury.ride b/contracts/treasury/treasury.ride index e420ad6..6cb0153 100644 --- a/contracts/treasury/treasury.ride +++ b/contracts/treasury/treasury.ride @@ -28,6 +28,16 @@ func keyAdminAddressList() = makeString(["%s", "adminAddressList"], SEP) # Allowed TXID key func keyAllowedTxId() = makeString(["%s", "txId"], SEP) +func keyConfigAddress() = "%s__config" +func keyVotingResultAddress() = "contract_voting_result" +func keyProposalAllowBroadcast(address: Address, txId: ByteVector) = { + "proposal_allow_broadcast_" + address.toString() + "_" + txId.toBase58String() +} +let configAddress = this.getString(keyConfigAddress()).valueOrErrorMessage(wrapErr("no config")) + .addressFromString().valueOrErrorMessage(wrapErr("invalid config address")) +let votingResultContract = configAddress.getString(keyVotingResultAddress()).valueOrErrorMessage(wrapErr("no voting result address")) + .addressFromString().valueOrErrorMessage(wrapErr("invalid voting result address")) + func getAdminVote(prefix: String, admin: String) = { let voteKey = keyFullAdminVote(prefix, admin) getInteger(voteKey).valueOrElse(0) @@ -119,8 +129,9 @@ func verify() = { .valueOrErrorMessage(wrapErr("tx is not allowed")) .fromBase58String() let currentAdminList = getAdminsList() + let proposalAllowBroadcast = votingResultContract.getBoolean(keyProposalAllowBroadcast(this, tx.id)).valueOrElse(false) if (currentAdminList.size() == ADMIN_LIST_SIZE) then { - (tx.id == allowedTxId) + tx.id == allowedTxId || proposalAllowBroadcast } else { sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) } From 32c5881de5be14bc09d69081353283bdabdb52e7 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 25 May 2023 14:42:09 +0500 Subject: [PATCH 003/143] fix verifier --- .../treasury/test/{setup.js => _setup.js} | 30 ------ contracts/treasury/test/admins.spec.js | 80 ++++++++++++++++ contracts/treasury/test/vote_for_tx.spec.js | 35 ++++++- contracts/treasury/treasury.ride | 33 ++++--- package.json | 1 - pnpm-lock.yaml | 91 ------------------- 6 files changed, 133 insertions(+), 137 deletions(-) rename contracts/treasury/test/{setup.js => _setup.js} (73%) create mode 100644 contracts/treasury/test/admins.spec.js diff --git a/contracts/treasury/test/setup.js b/contracts/treasury/test/_setup.js similarity index 73% rename from contracts/treasury/test/setup.js rename to contracts/treasury/test/_setup.js index 9601cdd..a4115d6 100644 --- a/contracts/treasury/test/setup.js +++ b/contracts/treasury/test/_setup.js @@ -38,18 +38,6 @@ export const setupAccounts = async () => { await setScriptFromFile(treasuryPath, accounts.treasury.seed) - await broadcastAndWait(data({ - additionalFee: 4e5, - data: [ - { - key: '%s__config', - type: 'string', - value: accounts.config.address - } - ], - chainId - }, accounts.treasury.seed)) - await broadcastAndWait(data({ additionalFee: 4e5, data: [ @@ -62,24 +50,6 @@ export const setupAccounts = async () => { chainId }, accounts.config.seed)) - const adminsListString = [ - accounts.admin1.address, - accounts.admin2.address, - accounts.admin3.address - ].join('__') - const setAdminsTx = data({ - additionalFee: 4e5, - data: [ - { - key: '%s__adminAddressList', - type: 'string', - value: adminsListString - } - ], - chainId - }, accounts.treasury.seed) - await broadcastAndWait(setAdminsTx) - const accountsInfo = Object.entries(accounts) .map(([name, { seed, address }]) => [name, address]) console.log(table(accountsInfo, { diff --git a/contracts/treasury/test/admins.spec.js b/contracts/treasury/test/admins.spec.js new file mode 100644 index 0000000..ebd4e80 --- /dev/null +++ b/contracts/treasury/test/admins.spec.js @@ -0,0 +1,80 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { data } from '@waves/waves-transactions' +import { broadcastAndWait, chainId } from '../../../utils/api.js' +import { setupAccounts } from './_setup.js' + +chai.use(chaiAsPromised) +const { expect } = chai + +describe(`[${process.pid}] treasury: admins`, () => { + let dataTx, accounts + + before(async () => { + accounts = await setupAccounts() + + dataTx = data( + { + additionalFee: 4e5, + data: [{ key: 'foo', type: 'string', value: 'bar' }], + chainId + }, + accounts.treasury.seed + ) + }) + + it('can set admins by owner initially', async () => { + const setAdminsTx = data({ + additionalFee: 4e5, + data: [ + { + key: '%s__adminAddressList', + type: 'string', + value: [ + accounts.admin1.address, + accounts.admin2.address, + accounts.admin3.address + ].join('__') + } + ], + chainId + }, accounts.treasury.seed) + return expect(broadcastAndWait(setAdminsTx)).to.be.fulfilled + }) + + it('owner can set config address if it was not specified', async () => { + const setConfigAddressTx = data({ + additionalFee: 4e5, + data: [ + { + key: '%s__config', + type: 'string', + value: accounts.config.address + } + ], + chainId + }, accounts.treasury.seed) + + return expect(broadcastAndWait(setConfigAddressTx)).to.be.fulfilled + }) + + it('owner is denied after admins and config address are specified', async () => { + return expect(broadcastAndWait(dataTx)).to.be.rejectedWith('Transaction is not allowed by account-script') + }) + + it('tx by proposal should be successfully broadcasted', async () => { + await broadcastAndWait(data({ + additionalFee: 4e5, + data: [ + { + key: `proposal_allow_broadcast_${accounts.treasury.address}_${dataTx.id}`, + type: 'boolean', + value: true + } + ], + chainId + }, accounts.votingResult.seed)) + + return expect(broadcastAndWait(dataTx)).to.be.fulfilled + }) +}) diff --git a/contracts/treasury/test/vote_for_tx.spec.js b/contracts/treasury/test/vote_for_tx.spec.js index c1f4f40..cecf10c 100644 --- a/contracts/treasury/test/vote_for_tx.spec.js +++ b/contracts/treasury/test/vote_for_tx.spec.js @@ -2,7 +2,7 @@ import chai from 'chai' import chaiAsPromised from 'chai-as-promised' import { invokeScript, data } from '@waves/waves-transactions' import { api, broadcastAndWait, chainId } from '../../../utils/api.js' -import { setupAccounts } from './setup.js' +import { setupAccounts } from './_setup.js' chai.use(chaiAsPromised) const { expect } = chai @@ -13,6 +13,37 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { before(async () => { accounts = await setupAccounts() treasury = accounts.treasury.address + + await broadcastAndWait(data({ + additionalFee: 4e5, + data: [ + { + key: '%s__config', + type: 'string', + value: accounts.config.address + } + ], + chainId + }, accounts.treasury.seed)) + + // set admins + const setAdminsTx = data({ + additionalFee: 4e5, + data: [ + { + key: '%s__adminAddressList', + type: 'string', + value: [ + accounts.admin1.address, + accounts.admin2.address, + accounts.admin3.address + ].join('__') + } + ], + chainId + }, accounts.treasury.seed) + await broadcastAndWait(setAdminsTx) + dataTx = data( { additionalFee: 4e5, @@ -24,7 +55,7 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { }) it('tx should be rejected before vote for allowed txid', async () => { - return expect(api.transactions.broadcast(dataTx)).to.be.rejectedWith('tx is not allowed') + return expect(api.transactions.broadcast(dataTx)).to.be.rejectedWith('Transaction is not allowed by account-script') }) it('first vote should increment votes count', async () => { diff --git a/contracts/treasury/treasury.ride b/contracts/treasury/treasury.ride index 6cb0153..0668ec8 100644 --- a/contracts/treasury/treasury.ride +++ b/contracts/treasury/treasury.ride @@ -33,10 +33,19 @@ func keyVotingResultAddress() = "contract_voting_result" func keyProposalAllowBroadcast(address: Address, txId: ByteVector) = { "proposal_allow_broadcast_" + address.toString() + "_" + txId.toBase58String() } -let configAddress = this.getString(keyConfigAddress()).valueOrErrorMessage(wrapErr("no config")) - .addressFromString().valueOrErrorMessage(wrapErr("invalid config address")) -let votingResultContract = configAddress.getString(keyVotingResultAddress()).valueOrErrorMessage(wrapErr("no voting result address")) - .addressFromString().valueOrErrorMessage(wrapErr("invalid voting result address")) +let configAddressOption = match this.getString(keyConfigAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit +} +let configAddress = configAddressOption.valueOrErrorMessage(wrapErr("invalid config address")) +let votingResultContractOption = match configAddressOption { + case a: Address => match a.getString(keyVotingResultAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit + } + case _: Unit => unit +} +let votingResultContract = votingResultContractOption.valueOrErrorMessage(wrapErr("invalid voting result address")) func getAdminVote(prefix: String, admin: String) = { let voteKey = keyFullAdminVote(prefix, admin) @@ -125,14 +134,12 @@ func voteForTxId(txId: String) = { @Verifier(tx) func verify() = { - let allowedTxId = getString(keyAllowedTxId()) - .valueOrErrorMessage(wrapErr("tx is not allowed")) - .fromBase58String() + let allowedTxIdStringOption = getString(keyAllowedTxId()) let currentAdminList = getAdminsList() - let proposalAllowBroadcast = votingResultContract.getBoolean(keyProposalAllowBroadcast(this, tx.id)).valueOrElse(false) - if (currentAdminList.size() == ADMIN_LIST_SIZE) then { - tx.id == allowedTxId || proposalAllowBroadcast - } else { - sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) - } + let byProposal = votingResultContract.getBoolean(keyProposalAllowBroadcast(this, tx.id)).valueOrElse(false) + let byAdmins = allowedTxIdStringOption != unit && tx.id == allowedTxIdStringOption.value().fromBase58String() + let byOwner = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) + if (votingResultContractOption != unit && currentAdminList.size() == ADMIN_LIST_SIZE) then { + byProposal || byAdmins + } else byOwner } diff --git a/package.json b/package.json index e14af2f..50628bb 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "@waves/waves-transactions": "^4.2.10", "chai": "^4.3.7", "chai-as-promised": "^7.1.1", - "concurrently": "^8.0.1", "dotenv": "^16.0.3", "mocha": "^10.2.0", "table": "^6.8.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 000ef3d..9e11a38 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,9 +19,6 @@ dependencies: chai-as-promised: specifier: ^7.1.1 version: 7.1.1(chai@4.3.7) - concurrently: - specifier: ^8.0.1 - version: 8.0.1 dotenv: specifier: ^16.0.3 version: 16.0.3 @@ -72,13 +69,6 @@ packages: js-tokens: 4.0.0 dev: false - /@babel/runtime@7.21.5: - resolution: {integrity: sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.11 - dev: false - /@eslint-community/eslint-utils@4.4.0(eslint@8.41.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -656,15 +646,6 @@ packages: wrap-ansi: 7.0.0 dev: false - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: false - /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -694,22 +675,6 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - /concurrently@8.0.1: - resolution: {integrity: sha512-Sh8bGQMEL0TAmAm2meAXMjcASHZa7V0xXQVDBLknCPa9TPtkY9yYs+0cnGGgfdkW0SV1Mlg+hVGfXcoI8d3MJA==} - engines: {node: ^14.13.0 || >=16.0.0} - hasBin: true - dependencies: - chalk: 4.1.2 - date-fns: 2.30.0 - lodash: 4.17.21 - rxjs: 7.8.1 - shell-quote: 1.8.1 - spawn-command: 0.0.2-1 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 17.7.2 - dev: false - /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -719,13 +684,6 @@ packages: which: 2.0.2 dev: true - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - dependencies: - '@babel/runtime': 7.21.5 - dev: false - /debug@3.1.0: resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} peerDependencies: @@ -1685,10 +1643,6 @@ packages: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: false - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false - /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} @@ -1974,10 +1928,6 @@ packages: picomatch: 2.3.1 dev: false - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: false - /regexp.prototype.flags@1.5.0: resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} engines: {node: '>= 0.4'} @@ -2034,12 +1984,6 @@ packages: queue-microtask: 1.2.3 dev: true - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - dependencies: - tslib: 2.5.2 - dev: false - /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false @@ -2083,10 +2027,6 @@ packages: engines: {node: '>=8'} dev: true - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: false - /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -2109,10 +2049,6 @@ packages: is-fullwidth-code-point: 3.0.0 dev: false - /spawn-command@0.0.2-1: - resolution: {integrity: sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=} - dev: false - /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -2219,11 +2155,6 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: false - /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: @@ -2233,10 +2164,6 @@ packages: strip-bom: 3.0.0 dev: true - /tslib@2.5.2: - resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} - dev: false - /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -2356,11 +2283,6 @@ packages: engines: {node: '>=10'} dev: false - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: false - /yargs-unparser@2.0.0: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} engines: {node: '>=10'} @@ -2384,19 +2306,6 @@ packages: yargs-parser: 20.2.4 dev: false - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: false - /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} From 8da9c149ef412bc8085f12057d19c81a6fe8c947 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 25 May 2023 19:45:10 +0500 Subject: [PATCH 004/143] multisig 3/5 --- contracts/treasury/test/_setup.js | 2 + contracts/treasury/test/admins.spec.js | 4 +- contracts/treasury/test/vote_for_tx.spec.js | 49 ++++++++++++++++----- contracts/treasury/treasury.ride | 12 ++--- 4 files changed, 49 insertions(+), 18 deletions(-) diff --git a/contracts/treasury/test/_setup.js b/contracts/treasury/test/_setup.js index a4115d6..5bbc6b4 100644 --- a/contracts/treasury/test/_setup.js +++ b/contracts/treasury/test/_setup.js @@ -23,6 +23,8 @@ export const setupAccounts = async () => { 'admin1', 'admin2', 'admin3', + 'admin4', + 'admin5', 'user1' ] const accounts = Object.fromEntries(names.map((item) => { diff --git a/contracts/treasury/test/admins.spec.js b/contracts/treasury/test/admins.spec.js index ebd4e80..3e22891 100644 --- a/contracts/treasury/test/admins.spec.js +++ b/contracts/treasury/test/admins.spec.js @@ -33,7 +33,9 @@ describe(`[${process.pid}] treasury: admins`, () => { value: [ accounts.admin1.address, accounts.admin2.address, - accounts.admin3.address + accounts.admin3.address, + accounts.admin4.address, + accounts.admin5.address ].join('__') } ], diff --git a/contracts/treasury/test/vote_for_tx.spec.js b/contracts/treasury/test/vote_for_tx.spec.js index cecf10c..d56544e 100644 --- a/contracts/treasury/test/vote_for_tx.spec.js +++ b/contracts/treasury/test/vote_for_tx.spec.js @@ -36,7 +36,9 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { value: [ accounts.admin1.address, accounts.admin2.address, - accounts.admin3.address + accounts.admin3.address, + accounts.admin4.address, + accounts.admin5.address ].join('__') } ], @@ -58,8 +60,8 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { return expect(api.transactions.broadcast(dataTx)).to.be.rejectedWith('Transaction is not allowed by account-script') }) - it('first vote should increment votes count', async () => { - const vote1tx = invokeScript( + it('first votes should increment votes count', async () => { + await broadcastAndWait(invokeScript( { dApp: treasury, call: { @@ -69,20 +71,37 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { chainId }, accounts.admin1.seed - ) - const vote1 = await broadcastAndWait(vote1tx) + )) + await broadcastAndWait(invokeScript( + { + dApp: treasury, + call: { + function: 'voteForTxId', + args: [{ type: 'string', value: dataTx.id }] + }, + chainId + }, + accounts.admin2.seed + )) - expect(vote1.stateChanges.data).to.eql([ + const allowTxIdVotes = await api.addresses.data(treasury, { matches: encodeURIComponent(`%s%s%s__allowTxId__${dataTx.id}__.+`) }) + + expect(allowTxIdVotes).to.deep.include.members([ { key: `%s%s%s__allowTxId__${dataTx.id}__${accounts.admin1.address}`, type: 'integer', value: 1 + }, + { + key: `%s%s%s__allowTxId__${dataTx.id}__${accounts.admin2.address}`, + type: 'integer', + value: 1 } ]) }) - it('second vote should approve tx and remove voting data', async () => { - const vote2tx = invokeScript( + it('last vote should approve tx and remove voting data', async () => { + const voteTx = invokeScript( { dApp: treasury, call: { @@ -91,11 +110,11 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { }, chainId }, - accounts.admin3.seed + accounts.admin5.seed ) - const vote2 = await broadcastAndWait(vote2tx) + const { stateChanges } = await broadcastAndWait(voteTx) - expect(vote2.stateChanges.data).to.eql([ + expect(stateChanges.data).to.eql([ { key: `%s%s%s__allowTxId__${dataTx.id}__${accounts.admin1.address}`, value: null @@ -108,6 +127,14 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { key: `%s%s%s__allowTxId__${dataTx.id}__${accounts.admin3.address}`, value: null }, + { + key: `%s%s%s__allowTxId__${dataTx.id}__${accounts.admin4.address}`, + value: null + }, + { + key: `%s%s%s__allowTxId__${dataTx.id}__${accounts.admin5.address}`, + value: null + }, { key: '%s__txId', type: 'string', diff --git a/contracts/treasury/treasury.ride b/contracts/treasury/treasury.ride index 0668ec8..9b3912a 100644 --- a/contracts/treasury/treasury.ride +++ b/contracts/treasury/treasury.ride @@ -4,8 +4,8 @@ let SEP = "__" let contractFilename = "treasury.ride" -let ADMIN_LIST_SIZE = 3 -let QUORUM = 2 +let ADMIN_LIST_SIZE = 5 +let QUORUM = 3 let ADDRESS_BYTES_LENGTH = 26 let TXID_BYTES_LENGTH = 32 @@ -70,7 +70,7 @@ func genVotesKeysHelper(a: (List[String], String), adminAddress: String) = { } func genVotesKeys(keyPrefix: String) = { let adminList = keyAdminAddressList() - let (result, prefix) = FOLD<3>(getAdminsList(), ([], keyPrefix), genVotesKeysHelper) + let (result, prefix) = FOLD<5>(getAdminsList(), ([], keyPrefix), genVotesKeysHelper) result } @@ -80,7 +80,7 @@ func countVotesHelper(result: Int, voteKey: String) = { } func countVotes(prefix: String) = { let votes = genVotesKeys(prefix) - FOLD<3>(votes, 0, countVotesHelper) + FOLD<5>(votes, 0, countVotesHelper) } # Generate DeleteEntry for all votes with Prefix @@ -89,7 +89,7 @@ func clearVotesHelper(result: List[DeleteEntry], key: String) = { } func getClearVoteEntries(prefix: String) = { let votes = genVotesKeys(prefix) - FOLD<3>(votes, [], clearVotesHelper) + FOLD<5>(votes, [], clearVotesHelper) } func voteINTERNAL( @@ -116,7 +116,7 @@ func voteINTERNAL( } } -# Vote for txId that is allowed in Verifier (quorum: 2 votes) +# Vote for txId that is allowed in Verifier @Callable(i) func voteForTxId(txId: String) = { let callerAddressString = toBase58String(i.caller.bytes) From 08ed578d1bfc6c7915743e0837593b55b275b179 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 26 May 2023 11:50:16 +0500 Subject: [PATCH 005/143] voteForTxId throw if allowed --- contracts/treasury/test/vote_for_tx.spec.js | 16 ++++++++++++++++ contracts/treasury/treasury.ride | 11 +++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/contracts/treasury/test/vote_for_tx.spec.js b/contracts/treasury/test/vote_for_tx.spec.js index d56544e..12a9acf 100644 --- a/contracts/treasury/test/vote_for_tx.spec.js +++ b/contracts/treasury/test/vote_for_tx.spec.js @@ -143,6 +143,22 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { ]) }) + it('vote should be failed if tx is already allowed', async () => { + const voteTx = invokeScript( + { + dApp: treasury, + call: { + function: 'voteForTxId', + args: [{ type: 'string', value: dataTx.id }] + }, + chainId + }, + accounts.admin3.seed + ) + + return expect(broadcastAndWait(voteTx)).to.be.rejectedWith(`${dataTx.id} is already allowed`) + }) + it('tx should be allowed after vote for allowed txid', async () => { return expect(broadcastAndWait(dataTx)).to.be.fulfilled }) diff --git a/contracts/treasury/treasury.ride b/contracts/treasury/treasury.ride index 9b3912a..8685026 100644 --- a/contracts/treasury/treasury.ride +++ b/contracts/treasury/treasury.ride @@ -6,7 +6,6 @@ let SEP = "__" let contractFilename = "treasury.ride" let ADMIN_LIST_SIZE = 5 let QUORUM = 3 -let ADDRESS_BYTES_LENGTH = 26 let TXID_BYTES_LENGTH = 32 func wrapErr(s: String) = { @@ -122,12 +121,12 @@ func voteForTxId(txId: String) = { let callerAddressString = toBase58String(i.caller.bytes) let keyPrefix = keyAllowedTxIdVotePrefix(txId) let result = [ StringEntry(keyAllowedTxId(), txId) ] + let allowedTxIdOption = this.getString(keyAllowedTxId()) - strict err = if (txId.fromBase58String().size() != TXID_BYTES_LENGTH) then { - throwErr(txId + " is not valid txId") - } else { - unit - } + strict err = [ + txId.fromBase58String().size() == TXID_BYTES_LENGTH || throwErr(txId + " is not valid txId"), + allowedTxIdOption == unit || allowedTxIdOption.value() != txId || throwErr(txId + " is already allowed") + ] voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result) } From 81d8b5cac355874748cfdfc6a1c62c7a6b1f896f Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 26 May 2023 12:32:53 +0500 Subject: [PATCH 006/143] fix verifier --- contracts/treasury/treasury.ride | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/treasury/treasury.ride b/contracts/treasury/treasury.ride index 8685026..80a1dcd 100644 --- a/contracts/treasury/treasury.ride +++ b/contracts/treasury/treasury.ride @@ -138,7 +138,7 @@ func verify() = { let byProposal = votingResultContract.getBoolean(keyProposalAllowBroadcast(this, tx.id)).valueOrElse(false) let byAdmins = allowedTxIdStringOption != unit && tx.id == allowedTxIdStringOption.value().fromBase58String() let byOwner = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) - if (votingResultContractOption != unit && currentAdminList.size() == ADMIN_LIST_SIZE) then { - byProposal || byAdmins + if (configAddressOption != unit && currentAdminList.size() == ADMIN_LIST_SIZE) then { + (votingResultContractOption != unit && byProposal) || byAdmins } else byOwner } From 85c5b2ed50315ed3818d182478a8080855e672ba Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 26 May 2023 19:04:46 +0500 Subject: [PATCH 007/143] factory, calculator draft --- contracts/calculator/calculator.ride | 27 +++++++++++++++++ contracts/factory/factory.ride | 45 ++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 contracts/calculator/calculator.ride create mode 100644 contracts/factory/factory.ride diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride new file mode 100644 index 0000000..bca23a5 --- /dev/null +++ b/contracts/calculator/calculator.ride @@ -0,0 +1,27 @@ +{-# STDLIB_VERSION 6 #-} +{-# CONTENT_TYPE DAPP #-} +{-# SCRIPT_TYPE ACCOUNT #-} + +let SEP = "__" +let contractFilename = "calculator.ride" + +func wrapErr(s: String) = { + contractFilename + ": " + s +} + +func throwErr(s: String) = { + throw(wrapErr(s)) +} + +func keyFactoryAddress() = "%s__factory" + +let factoryAddressOption = match this.getString(keyFactoryAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit +} +let factoryAddress = factoryAddressOption.valueOrErrorMessage(wrapErr("invalid factory address")) + +@Verifier(tx) +func verify() = { + false +} diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride new file mode 100644 index 0000000..cc04560 --- /dev/null +++ b/contracts/factory/factory.ride @@ -0,0 +1,45 @@ +{-# STDLIB_VERSION 6 #-} +{-# CONTENT_TYPE DAPP #-} +{-# SCRIPT_TYPE ACCOUNT #-} + +let SEP = "__" +let contractFilename = "factory.ride" + +func wrapErr(s: String) = { + contractFilename + ": " + s +} + +func throwErr(s: String) = { + throw(wrapErr(s)) +} + +func keyCalculatorAddress() = "%s__calculator" +func keyTreasuryAddress() = "%s__treasury" + +func keyConfigAddress() = "%s__config" +func keyVotingResultAddress() = "contract_voting_result" +func keyProposalAllowBroadcast(address: Address, txId: ByteVector) = { + "proposal_allow_broadcast_" + address.toString() + "_" + txId.toBase58String() +} +let configAddressOption = match this.getString(keyConfigAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit +} +let configAddress = configAddressOption.valueOrErrorMessage(wrapErr("invalid config address")) +let votingResultContractOption = match configAddressOption { + case a: Address => match a.getString(keyVotingResultAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit + } + case _: Unit => unit +} +let votingResultContract = votingResultContractOption.valueOrErrorMessage(wrapErr("invalid voting result address")) + +@Verifier(tx) +func verify() = { + let byProposal = votingResultContract.getBoolean(keyProposalAllowBroadcast(this, tx.id)).valueOrElse(false) + let byOwner = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) + if (votingResultContractOption != unit) then { + byProposal + } else byOwner +} From 214df75da735d23807b64adeb2a329bf46a26a8d Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 26 May 2023 19:58:48 +0500 Subject: [PATCH 008/143] some comments --- contracts/factory/factory.ride | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index cc04560..9308b2b 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -14,9 +14,16 @@ func throwErr(s: String) = { } func keyCalculatorAddress() = "%s__calculator" -func keyTreasuryAddress() = "%s__treasury" +func keyTreasuryAddress() = "%s__treasury" # 3PEgG7eZHLFhcfsTSaYxgRhZsh4AxMvA4Ms +func keyChildAddress() = "%s__child" # 3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h + +# early investments are stored in contract_children +# investments_token_ +# investments_total_ +# investor__ func keyConfigAddress() = "%s__config" +func keyChildrenAddress() = "contract_children" func keyVotingResultAddress() = "contract_voting_result" func keyProposalAllowBroadcast(address: Address, txId: ByteVector) = { "proposal_allow_broadcast_" + address.toString() + "_" + txId.toBase58String() From 5aba7349d55d3e961e1c8cc800ae69699183060b Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 31 May 2023 15:48:44 +0500 Subject: [PATCH 009/143] initial investors tx --- migrations/initial_investors.json | 204 ++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 migrations/initial_investors.json diff --git a/migrations/initial_investors.json b/migrations/initial_investors.json new file mode 100644 index 0000000..dba292b --- /dev/null +++ b/migrations/initial_investors.json @@ -0,0 +1,204 @@ +{ + "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", + "data": [ + { + "key": "%s%s__invested__WAVES", + "type": "integer", + "value": 122581754945 + }, + { + "key": "%s%s__invested__DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p", + "type": "integer", + "value": 19600000000000 + }, + { + "key": "%s%s__available__3P2EDoG2nxrXGwcGT8RkGhWJje61ZMCuXr3", + "type": "integer", + "value": 5000000000 + }, + { + "key": "%s%s__available__3P2ZqavVvTP8HA8uz2sjp3NtoUdUWDUVSL4", + "type": "integer", + "value": 200000000 + }, + { + "key": "%s%s__available__3P33dk2pYeVQiVuA9BCE4mTe1nnamrzeb2A", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3P46n8PuQ8rEQFfyLiVDdozyuq43KQa7g68", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p", + "type": "integer", + "value": 10000000000 + }, + { + "key": "%s%s__available__3P5smPV4Lq911ZBJFPun7sibZDATvioGy1b", + "type": "integer", + "value": 5021811692 + }, + { + "key": "%s%s__available__3P67EjvAjuJ4FTk9D25zo1Se9tx8K32BeCp", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3P6FjQcHZNggULXG8twvbjpsT1sBU8Sh2yv", + "type": "integer", + "value": 500000000 + }, + { + "key": "%s%s__available__3P6MixDu7Lrn5mgwQ7zeRZvYkLqR53vUc8y", + "type": "integer", + "value": 10000000000 + }, + { + "key": "%s%s__available__3P7Ek7RxbKw1vjG1eoAzKPtQ2q3GiJEzw9n", + "type": "integer", + "value": 24055943253 + }, + { + "key": "%s%s__available__3P8VmFGb1ZrvJmBFYRvkVkvrxnGNS17aZxi", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3P8qVX189qpoTJZQQQdKS9endHK5sxWsvrd", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3P95VmRT1svc9aa5E5vhvkUSmmMHeKX3wLS", + "type": "integer", + "value": 200000000 + }, + { + "key": "%s%s__available__3PAHz5G9v3GXSw1sXLdL3g1HrGrSywYWv8P", + "type": "integer", + "value": 4000000 + }, + { + "key": "%s%s__available__3PAuU9oc5YmkoHnb4KQMCkxn9ebsykynBCH", + "type": "integer", + "value": 10000000000 + }, + { + "key": "%s%s__available__3PDw45Y9fVoX4vh9BcF5vERTqL4Zsij1f6w", + "type": "integer", + "value": 200000000 + }, + { + "key": "%s%s__available__3PE4NAyqUCgb2nfUBxdodXg7VhaAFs8xm2Q", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3PEqqh3tdtGoiaDKGnWL28XrFD6ibb3B1ns", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3PFT1THjRyWssFaKRuBrqhq9HteKPd2GDBm", + "type": "integer", + "value": 500000000 + }, + { + "key": "%s%s__available__3PGDywXYEdWACTs8rksuX9dxS3uGoWQpPyb", + "type": "integer", + "value": 5000000000 + }, + { + "key": "%s%s__available__3PGLsuxuRSnmYXX1TDevrXwQDED4NWdJSjw", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ", + "type": "integer", + "value": 1000000000 + }, + { + "key": "%s%s__available__3PJmNd7oXYHqDD92xYH4f6zxNxEV45togP3", + "type": "integer", + "value": 1000000000 + }, + { + "key": "%s%s__available__3PK2p9Kz82a9JsvLtEZb5rZEgxpqBvGbz3V", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3PKmahfMDZ2LFF76qf2Xd4TR14f4qWXuUY4", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3PLywPiMYmwbKNEBJLvAbjEnkH1mLs57RjH", + "type": "integer", + "value": 200000000 + }, + { + "key": "%s%s__available__3PM3AZ7zQ5nz2La92f2g3MGcMVBLXGd5fZV", + "type": "integer", + "value": 5000000000 + }, + { + "key": "%s%s__available__3PMFevCLzPhbEUfTxK5bADhxyktttrSWEb6", + "type": "integer", + "value": 1000000000 + }, + { + "key": "%s%s__available__3PPEMdjkKiYE37eNk6h2Qw7U2mxg2VzGv71", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3PPKWarUghNtYWW3viy3YSStxWmqGnywdW8", + "type": "integer", + "value": 2000000000 + }, + { + "key": "%s%s__available__3PPMeqbiarMsqpvnKsz8UMr14Zp3D22TzQF", + "type": "integer", + "value": 200000000 + }, + { + "key": "%s%s__available__3PPWaEsPDH6mRs7X7kE7wC7Ctn7c5NUViNd", + "type": "integer", + "value": 15000000000 + }, + { + "key": "%s%s__available__3PPqxqzL6wiw59GPAc2j3YHcmFxRNzyjQxL", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3PQB4e2fMDXLj85PahjJMjbdHrH1jskpxVJ", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3PQH4tvDSiA1Yyc8YtPXCeZFXNnY4D6wCxd", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s__available__3PQhGvLgHdUt4GviS8wX5ZwqAZQPv5mnUoi", + "type": "integer", + "value": 25000000000 + } + ], + "proofs": [], + "fee": 300000, + "type": 12, + "version": 2 +} \ No newline at end of file From b70516e1c8cc040e4de48ceaa6f70fab580cd832 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 31 May 2023 15:49:12 +0500 Subject: [PATCH 010/143] calculator in factory --- contracts/calculator/calculator.ride | 7 ++++ contracts/factory/factory.ride | 49 +++++++++++++++++++++++----- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index bca23a5..98f9db2 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -21,6 +21,13 @@ let factoryAddressOption = match this.getString(keyFactoryAddress()) { } let factoryAddress = factoryAddressOption.valueOrErrorMessage(wrapErr("invalid factory address")) +@Callable(i) +func claimLP() = { + # claim for common investor + # claim for miner + (nil, unit) +} + @Verifier(tx) func verify() = { false diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 9308b2b..4e224a8 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -17,36 +17,67 @@ func keyCalculatorAddress() = "%s__calculator" func keyTreasuryAddress() = "%s__treasury" # 3PEgG7eZHLFhcfsTSaYxgRhZsh4AxMvA4Ms func keyChildAddress() = "%s__child" # 3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h -# early investments are stored in contract_children -# investments_token_ -# investments_total_ -# investor__ +let calculatorAddressOption = match this.getString(keyCalculatorAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit +} +let calculatorAddressOrFail = calculatorAddressOption.valueOrErrorMessage(wrapErr("invalid calculator address")) func keyConfigAddress() = "%s__config" + +# config keys func keyChildrenAddress() = "contract_children" func keyVotingResultAddress() = "contract_voting_result" + +# voting result keys func keyProposalAllowBroadcast(address: Address, txId: ByteVector) = { "proposal_allow_broadcast_" + address.toString() + "_" + txId.toBase58String() } + +# children keys +# early investments are stored in config.contract_children +# investments_token_ +# investments_total_ +# investor__ +func keyInvestedByUser(childAddress: Address, userAddress: Address) = [ + "investor", + childAddress.toString(), + userAddress.toString() +].makeString("_") + + let configAddressOption = match this.getString(keyConfigAddress()) { case s: String => s.addressFromString() case _: Unit => unit } -let configAddress = configAddressOption.valueOrErrorMessage(wrapErr("invalid config address")) -let votingResultContractOption = match configAddressOption { +let configAddressOrFail = configAddressOption.valueOrErrorMessage(wrapErr("invalid config address")) + +let votingResultAddressOption = match configAddressOption { case a: Address => match a.getString(keyVotingResultAddress()) { case s: String => s.addressFromString() case _: Unit => unit } case _: Unit => unit } -let votingResultContract = votingResultContractOption.valueOrErrorMessage(wrapErr("invalid voting result address")) +let votingResultAddressOrFail = votingResultAddressOption.valueOrErrorMessage(wrapErr("invalid voting result address")) + +let childrenAddressOption = match configAddressOption { + case a: Address => match a.getString(keyChildrenAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit + } + case _: Unit => unit +} +let childrenAddressOrFail = childrenAddressOption.valueOrErrorMessage(wrapErr("invalid children address")) + +@Callable(i) +func claimLP() = (nil, calculatorAddressOrFail.invoke("claimLP", [], [])) @Verifier(tx) func verify() = { - let byProposal = votingResultContract.getBoolean(keyProposalAllowBroadcast(this, tx.id)).valueOrElse(false) + let byProposal = votingResultAddressOrFail.getBoolean(keyProposalAllowBroadcast(this, tx.id)).valueOrElse(false) let byOwner = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) - if (votingResultContractOption != unit) then { + if (votingResultAddressOption != unit) then { byProposal } else byOwner } From 0b24930043a8474990701cecadf0a13317791b71 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 31 May 2023 16:46:22 +0500 Subject: [PATCH 011/143] claimLP --- contracts/calculator/calculator.ride | 28 +++++++++++++++++++++++----- contracts/factory/factory.ride | 2 +- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 98f9db2..b984354 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -14,18 +14,36 @@ func throwErr(s: String) = { } func keyFactoryAddress() = "%s__factory" +func keyAvailable(userAddress: Address) = "%s%s__available__" + userAddress.toString() +func keyClaimed(userAddress: Address) = "%s%s__claimed__" + userAddress.toString() let factoryAddressOption = match this.getString(keyFactoryAddress()) { case s: String => s.addressFromString() case _: Unit => unit } -let factoryAddress = factoryAddressOption.valueOrErrorMessage(wrapErr("invalid factory address")) +let factoryAddressOrFail = factoryAddressOption.valueOrErrorMessage(wrapErr("invalid factory address")) + +func onlyAddress(i: Invocation, address: Address) = { + i.caller == address || throwErr("permission denied") +} + +func onlyFactory(i: Invocation) = { + onlyAddress(i, factoryAddressOrFail) +} @Callable(i) -func claimLP() = { - # claim for common investor - # claim for miner - (nil, unit) +func claimLP(userAddressBytes: ByteVector) = { + strict checkCaller = i.onlyFactory() + let userAddress = Address(userAddressBytes) + let available = factoryAddressOrFail.getInteger(keyAvailable(userAddress)).valueOrElse(0) + let claimed = factoryAddressOrFail.getInteger(keyClaimed(userAddress)).valueOrElse(0) + let actions = if (available > 0) then [ + ScriptTransfer(userAddress, available, unit), + IntegerEntry(keyAvailable(userAddress), 0), + IntegerEntry(keyClaimed(userAddress), claimed + available) + ] else [] + + (actions, available) } @Verifier(tx) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 4e224a8..26c0f91 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -71,7 +71,7 @@ let childrenAddressOption = match configAddressOption { let childrenAddressOrFail = childrenAddressOption.valueOrErrorMessage(wrapErr("invalid children address")) @Callable(i) -func claimLP() = (nil, calculatorAddressOrFail.invoke("claimLP", [], [])) +func claimLP() = (nil, calculatorAddressOrFail.invoke("claimLP", [i.caller.bytes], [])) @Verifier(tx) func verify() = { From 8c3333c469e8adb392cea0e5b14c60e8c8c90a94 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 31 May 2023 16:48:17 +0500 Subject: [PATCH 012/143] rewardForOption in treasury --- contracts/treasury/treasury.ride | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/contracts/treasury/treasury.ride b/contracts/treasury/treasury.ride index 80a1dcd..729cf4e 100644 --- a/contracts/treasury/treasury.ride +++ b/contracts/treasury/treasury.ride @@ -115,6 +115,17 @@ func voteINTERNAL( } } +func rewardForOption(rewards: List[(Address, Int)], target: Address) = { + let s = rewards.size() + let (a0, r0) = rewards[0] + let (a1, r1) = rewards[1] + let (a2, r2) = rewards[2] + if (s > 0 && a0 == target) then r0 + else if (s > 1 && a1 == target) then r1 + else if (s > 2 && a2 == target) then r2 + else unit +} + # Vote for txId that is allowed in Verifier @Callable(i) func voteForTxId(txId: String) = { From 51567b8a218ae962577446bf1f8c03f0e94cf2ac Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 31 May 2023 20:01:05 +0500 Subject: [PATCH 013/143] claimLP fix --- contracts/calculator/calculator.ride | 12 +++++++++++- contracts/factory/factory.md | 7 +++++++ contracts/factory/factory.ride | 10 ++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 contracts/factory/factory.md diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index b984354..ecb1fbe 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -14,6 +14,7 @@ func throwErr(s: String) = { } func keyFactoryAddress() = "%s__factory" +func keyLpAssetId() = "%s__lpAssetId" func keyAvailable(userAddress: Address) = "%s%s__available__" + userAddress.toString() func keyClaimed(userAddress: Address) = "%s%s__claimed__" + userAddress.toString() @@ -23,6 +24,15 @@ let factoryAddressOption = match this.getString(keyFactoryAddress()) { } let factoryAddressOrFail = factoryAddressOption.valueOrErrorMessage(wrapErr("invalid factory address")) +let lpAssetIdOption = match factoryAddressOption { + case a: Address => match a.getString(keyLpAssetId()) { + case s: String => s.fromBase58String() + case _: Unit => unit + } + case _: Unit => unit +} +let lpAssetIdOrFail = lpAssetIdOption.valueOrErrorMessage(wrapErr("invalid lpAssetId")) + func onlyAddress(i: Invocation, address: Address) = { i.caller == address || throwErr("permission denied") } @@ -38,7 +48,7 @@ func claimLP(userAddressBytes: ByteVector) = { let available = factoryAddressOrFail.getInteger(keyAvailable(userAddress)).valueOrElse(0) let claimed = factoryAddressOrFail.getInteger(keyClaimed(userAddress)).valueOrElse(0) let actions = if (available > 0) then [ - ScriptTransfer(userAddress, available, unit), + ScriptTransfer(userAddress, available, lpAssetIdOrFail), IntegerEntry(keyAvailable(userAddress), 0), IntegerEntry(keyClaimed(userAddress), claimed + available) ] else [] diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md new file mode 100644 index 0000000..1c73b4b --- /dev/null +++ b/contracts/factory/factory.md @@ -0,0 +1,7 @@ +### Required state entries + +| key | type | +| :--------------- | :------- | +| `%s__calculator` | `String` | +| `%s__treasury` | `String` | +| `%s__lpAssetId` | `String` | diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 26c0f91..7b0b781 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -17,6 +17,8 @@ func keyCalculatorAddress() = "%s__calculator" func keyTreasuryAddress() = "%s__treasury" # 3PEgG7eZHLFhcfsTSaYxgRhZsh4AxMvA4Ms func keyChildAddress() = "%s__child" # 3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h +func keyLpAssetId() = "%s__lpAssetId" + let calculatorAddressOption = match this.getString(keyCalculatorAddress()) { case s: String => s.addressFromString() case _: Unit => unit @@ -70,6 +72,14 @@ let childrenAddressOption = match configAddressOption { } let childrenAddressOrFail = childrenAddressOption.valueOrErrorMessage(wrapErr("invalid children address")) +func onlyAddress(i: Invocation, address: Address) = { + i.caller == address || throwErr("permission denied") +} + +func onlyThis(i: Invocation) = { + onlyAddress(i, this) +} + @Callable(i) func claimLP() = (nil, calculatorAddressOrFail.invoke("claimLP", [i.caller.bytes], [])) From e4b2e3cff31b6c9b6ff3cb9a89d334edf5110ac8 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 31 May 2023 20:07:56 +0500 Subject: [PATCH 014/143] topUp params --- contracts/calculator/calculator.ride | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index ecb1fbe..055c336 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -56,6 +56,16 @@ func claimLP(userAddressBytes: ByteVector) = { (actions, available) } +@Callable(i) +func topUp( + newTreasuryVolumeInWaves: Int, + xtnPrice: Int, + pwrManagersBonus: Int, # 0..1×10⁸ + treasuryVolumeDiffAllocationCoef: Int # -1..1×10⁸ +) = { + (nil, unit) +} + @Verifier(tx) func verify() = { false From 821a81a0904c4f436289a98f6e128fa3f84c2dae Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 1 Jun 2023 17:36:57 +0500 Subject: [PATCH 015/143] comment + entries in factory for calculator --- contracts/calculator/calculator.ride | 1 + contracts/factory/factory.ride | 31 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 055c336..1a58301 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -56,6 +56,7 @@ func claimLP(userAddressBytes: ByteVector) = { (actions, available) } +# payment in waves to fulfill all withdrawal requests @Callable(i) func topUp( newTreasuryVolumeInWaves: Int, diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 7b0b781..65d090c 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -80,6 +80,37 @@ func onlyThis(i: Invocation) = { onlyAddress(i, this) } +func onlyCalculator(i: Invocation) = { + onlyAddress(i, calculatorAddressOrFail) +} + +@Callable(i) +func stringEntry(key: String, val: String) = + if (i.onlyCalculator()) then ([StringEntry(key, val)], key) else ([], unit) + +@Callable(i) +func integerEntry(key: String, val: Int) = + if (i.onlyCalculator()) then ([IntegerEntry(key, val)], key) else ([], unit) + +@Callable(i) +func booleanEntry(key: String, val: Boolean) = + if (i.onlyCalculator()) then ([BooleanEntry(key, val)], key) else ([], unit) + +@Callable(i) +func binaryEntry(key: String, val: ByteVector) = + if (i.onlyCalculator()) then ([BinaryEntry(key, val)], key) else ([], unit) + +@Callable(i) +func deleteEntry(key: String) = + if (i.onlyCalculator()) then ([DeleteEntry(key)], key) else ([], unit) + +@Callable(i) +func emit(amount: Int) = { + strict checkCaller = i.onlyCalculator() + + (nil, unit) +} + @Callable(i) func claimLP() = (nil, calculatorAddressOrFail.invoke("claimLP", [i.caller.bytes], [])) From 5488f2a1abbece5139be027f2c35cbeb70abcd15 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 1 Jun 2023 17:59:16 +0500 Subject: [PATCH 016/143] functions templates --- contracts/calculator/calculator.ride | 22 +++++++++++++++++++++- contracts/factory/factory.ride | 23 ++++++++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 1a58301..b1defdb 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -58,7 +58,7 @@ func claimLP(userAddressBytes: ByteVector) = { # payment in waves to fulfill all withdrawal requests @Callable(i) -func topUp( +func finalize( newTreasuryVolumeInWaves: Int, xtnPrice: Int, pwrManagersBonus: Int, # 0..1×10⁸ @@ -67,6 +67,26 @@ func topUp( (nil, unit) } +@Callable(i) +func claimWaves(userAddressBytes: ByteVector, epoch: Int) = { + (nil, unit) +} + +@Callable(i) +func invest(userAddressBytes: ByteVector) = { + (nil, unit) +} + +@Callable(i) +func withdraw(userAddressBytes: ByteVector) = { + (nil, unit) +} + +@Callable(i) +func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { + (nil, unit) +} + @Verifier(tx) func verify() = { false diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 65d090c..fa89ed8 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -112,7 +112,28 @@ func emit(amount: Int) = { } @Callable(i) -func claimLP() = (nil, calculatorAddressOrFail.invoke("claimLP", [i.caller.bytes], [])) +func finalize() = + (nil, calculatorAddressOrFail.invoke("finalize", [i.caller.bytes], i.payments)) + +@Callable(i) +func claimLP() = + (nil, calculatorAddressOrFail.invoke("claimLP", [i.caller.bytes], i.payments)) + +@Callable(i) +func claimWaves(epoch: Int) = + (nil, calculatorAddressOrFail.invoke("claimWaves", [i.caller.bytes, epoch], i.payments)) + +@Callable(i) +func invest() = + (nil, calculatorAddressOrFail.invoke("invest", [i.caller.bytes], i.payments)) + +@Callable(i) +func withdraw() = + (nil, calculatorAddressOrFail.invoke("withdraw", [i.caller.bytes], i.payments)) + +@Callable(i) +func cancelWithdraw(txIdStr: String) = + (nil, calculatorAddressOrFail.invoke("cancelWithdraw", [i.caller.bytes, txIdStr.fromBase58String()], i.payments)) @Verifier(tx) func verify() = { From a3987f817d8440a8c402db3c1d81cdf223bdc158 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 1 Jun 2023 18:09:42 +0500 Subject: [PATCH 017/143] move rewardForOption to calculator --- contracts/calculator/calculator.ride | 11 +++++++++++ contracts/factory/factory.ride | 5 +++++ contracts/treasury/treasury.ride | 11 ----------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index b1defdb..369c656 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -41,6 +41,17 @@ func onlyFactory(i: Invocation) = { onlyAddress(i, factoryAddressOrFail) } +func rewardForOption(rewards: List[(Address, Int)], target: Address) = { + let s = rewards.size() + let (a0, r0) = rewards[0] + let (a1, r1) = rewards[1] + let (a2, r2) = rewards[2] + if (s > 0 && a0 == target) then r0 + else if (s > 1 && a1 == target) then r1 + else if (s > 2 && a2 == target) then r2 + else unit +} + @Callable(i) func claimLP(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index fa89ed8..6d75171 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -111,6 +111,7 @@ func emit(amount: Int) = { (nil, unit) } +# finalize period @Callable(i) func finalize() = (nil, calculatorAddressOrFail.invoke("finalize", [i.caller.bytes], i.payments)) @@ -135,6 +136,10 @@ func withdraw() = func cancelWithdraw(txIdStr: String) = (nil, calculatorAddressOrFail.invoke("cancelWithdraw", [i.caller.bytes, txIdStr.fromBase58String()], i.payments)) +# process miners blocks +@Callable(i) +func processBlocks() = (nil, calculatorAddressOrFail.invoke("processBlocks", [i.caller.bytes], i.payments)) + @Verifier(tx) func verify() = { let byProposal = votingResultAddressOrFail.getBoolean(keyProposalAllowBroadcast(this, tx.id)).valueOrElse(false) diff --git a/contracts/treasury/treasury.ride b/contracts/treasury/treasury.ride index 729cf4e..80a1dcd 100644 --- a/contracts/treasury/treasury.ride +++ b/contracts/treasury/treasury.ride @@ -115,17 +115,6 @@ func voteINTERNAL( } } -func rewardForOption(rewards: List[(Address, Int)], target: Address) = { - let s = rewards.size() - let (a0, r0) = rewards[0] - let (a1, r1) = rewards[1] - let (a2, r2) = rewards[2] - if (s > 0 && a0 == target) then r0 - else if (s > 1 && a1 == target) then r1 - else if (s > 2 && a2 == target) then r2 - else unit -} - # Vote for txId that is allowed in Verifier @Callable(i) func voteForTxId(txId: String) = { From da57b278837ea4924a69bbdcae597c0848281a80 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 1 Jun 2023 18:19:47 +0500 Subject: [PATCH 018/143] calculator.md --- contracts/calculator/calculator.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 contracts/calculator/calculator.md diff --git a/contracts/calculator/calculator.md b/contracts/calculator/calculator.md new file mode 100644 index 0000000..c227289 --- /dev/null +++ b/contracts/calculator/calculator.md @@ -0,0 +1,5 @@ +### Required state entries + +| key | type | +| :------------ | :------- | +| `%s__factory` | `String` | From 21097f84622f23c2aaef364618cc9936e2be8340 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 1 Jun 2023 19:01:45 +0500 Subject: [PATCH 019/143] test samples --- contracts/calculator/mock/factory.mock.ride | 6 ++ contracts/calculator/test/_setup.js | 62 +++++++++++++++++++ .../calculator/test/factory_address.spec.js | 20 ++++++ contracts/factory/mock/calculator.mock.ride | 8 +++ contracts/factory/test/_setup.js | 62 +++++++++++++++++++ contracts/factory/test/proxy.spec.js | 31 ++++++++++ 6 files changed, 189 insertions(+) create mode 100644 contracts/calculator/mock/factory.mock.ride create mode 100644 contracts/calculator/test/_setup.js create mode 100644 contracts/calculator/test/factory_address.spec.js create mode 100644 contracts/factory/mock/calculator.mock.ride create mode 100644 contracts/factory/test/_setup.js create mode 100644 contracts/factory/test/proxy.spec.js diff --git a/contracts/calculator/mock/factory.mock.ride b/contracts/calculator/mock/factory.mock.ride new file mode 100644 index 0000000..74e4a95 --- /dev/null +++ b/contracts/calculator/mock/factory.mock.ride @@ -0,0 +1,6 @@ +{-# STDLIB_VERSION 6 #-} +{-# CONTENT_TYPE DAPP #-} +{-# SCRIPT_TYPE ACCOUNT #-} + +@Callable(i) +func stringEntry(key: String, val: String) = (nil, unit) \ No newline at end of file diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js new file mode 100644 index 0000000..37258d1 --- /dev/null +++ b/contracts/calculator/test/_setup.js @@ -0,0 +1,62 @@ +import wc from '@waves/ts-lib-crypto' +import { + data, + massTransfer +} from '@waves/waves-transactions' +import { format } from 'path' +import { table, getBorderCharacters } from 'table' + +import { + chainId, broadcastAndWait, baseSeed, setScriptFromFile +} from '../../../utils/api.js' + +const nonceLength = 3 +const ridePath = 'contracts/calculator' +const mockPath = 'contracts/calculator/mock' +const calculatorPath = format({ dir: ridePath, base: 'calculator.ride' }) +const factoryMockPath = format({ dir: mockPath, base: 'factory.mock.ride' }) + +export const setupAccounts = async () => { + const nonce = wc.random(nonceLength, 'Buffer').toString('hex') + const names = [ + 'factory', + 'calculator', + 'treasury', + 'user1' + ] + const accounts = Object.fromEntries(names.map((item) => { + const seed = `${item}#${nonce}` + return [item, { seed, address: wc.address(seed, chainId), publicKey: wc.publicKey(seed) }] + })) + const amount = 100e8 + const massTransferTx = massTransfer({ + transfers: Object.values(accounts).map(({ address }) => ({ recipient: address, amount })), + chainId + }, baseSeed) + await broadcastAndWait(massTransferTx) + + await broadcastAndWait(data({ + additionalFee: 4e5, + data: [ + { + key: '%s__factory', + type: 'string', + value: accounts.factory.address + } + ], + chainId + }, accounts.calculator.seed)) + + await setScriptFromFile(calculatorPath, accounts.calculator.seed) + await setScriptFromFile(factoryMockPath, accounts.factory.seed) + + const accountsInfo = Object.entries(accounts) + .map(([name, { seed, address }]) => [name, address]) + console.log(table(accountsInfo, { + border: getBorderCharacters('norc'), + drawHorizontalLine: (index, size) => index === 0 || index === 1 || index === size, + header: { content: `pid: ${process.pid}, nonce: ${nonce}` } + })) + + return accounts +} diff --git a/contracts/calculator/test/factory_address.spec.js b/contracts/calculator/test/factory_address.spec.js new file mode 100644 index 0000000..133a8b8 --- /dev/null +++ b/contracts/calculator/test/factory_address.spec.js @@ -0,0 +1,20 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { api } from '../../../utils/api.js' +import { setupAccounts } from './_setup.js' + +chai.use(chaiAsPromised) +const { expect } = chai + +describe(`[${process.pid}] calculator: factory address`, () => { + let accounts + + before(async () => { + accounts = await setupAccounts() + }) + + it('factory address should be known', async () => { + const { result } = await api.utils.fetchEvaluate(accounts.calculator.address, 'factoryAddressOrFail') + expect(result.value.bytes.value).to.equal(accounts.factory.address) + }) +}) diff --git a/contracts/factory/mock/calculator.mock.ride b/contracts/factory/mock/calculator.mock.ride new file mode 100644 index 0000000..5282fde --- /dev/null +++ b/contracts/factory/mock/calculator.mock.ride @@ -0,0 +1,8 @@ +{-# STDLIB_VERSION 6 #-} +{-# CONTENT_TYPE DAPP #-} +{-# SCRIPT_TYPE ACCOUNT #-} + +@Callable(i) +func invest(userAddressBytes: ByteVector) = { + (nil, unit) +} diff --git a/contracts/factory/test/_setup.js b/contracts/factory/test/_setup.js new file mode 100644 index 0000000..b779e13 --- /dev/null +++ b/contracts/factory/test/_setup.js @@ -0,0 +1,62 @@ +import wc from '@waves/ts-lib-crypto' +import { + data, + massTransfer +} from '@waves/waves-transactions' +import { format } from 'path' +import { table, getBorderCharacters } from 'table' + +import { + chainId, broadcastAndWait, baseSeed, setScriptFromFile +} from '../../../utils/api.js' + +const nonceLength = 3 +const ridePath = 'contracts/factory' +const mockPath = 'contracts/factory/mock' +const factoryPath = format({ dir: ridePath, base: 'factory.ride' }) +const calculatorMockPath = format({ dir: mockPath, base: 'calculator.mock.ride' }) + +export const setupAccounts = async () => { + const nonce = wc.random(nonceLength, 'Buffer').toString('hex') + const names = [ + 'factory', + 'calculator', + 'treasury', + 'user1' + ] + const accounts = Object.fromEntries(names.map((item) => { + const seed = `${item}#${nonce}` + return [item, { seed, address: wc.address(seed, chainId), publicKey: wc.publicKey(seed) }] + })) + const amount = 100e8 + const massTransferTx = massTransfer({ + transfers: Object.values(accounts).map(({ address }) => ({ recipient: address, amount })), + chainId + }, baseSeed) + await broadcastAndWait(massTransferTx) + + await setScriptFromFile(factoryPath, accounts.factory.seed) + await setScriptFromFile(calculatorMockPath, accounts.calculator.seed) + + await broadcastAndWait(data({ + additionalFee: 4e5, + data: [ + { + key: '%s__calculator', + type: 'string', + value: accounts.calculator.address + } + ], + chainId + }, accounts.factory.seed)) + + const accountsInfo = Object.entries(accounts) + .map(([name, { seed, address }]) => [name, address]) + console.log(table(accountsInfo, { + border: getBorderCharacters('norc'), + drawHorizontalLine: (index, size) => index === 0 || index === 1 || index === size, + header: { content: `pid: ${process.pid}, nonce: ${nonce}` } + })) + + return accounts +} diff --git a/contracts/factory/test/proxy.spec.js b/contracts/factory/test/proxy.spec.js new file mode 100644 index 0000000..b29cac3 --- /dev/null +++ b/contracts/factory/test/proxy.spec.js @@ -0,0 +1,31 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { invokeScript } from '@waves/waves-transactions' +import { broadcastAndWait, chainId } from '../../../utils/api.js' +import { setupAccounts } from './_setup.js' + +chai.use(chaiAsPromised) +const { expect } = chai + +describe(`[${process.pid}] factory: proxy`, () => { + let accounts + + before(async () => { + accounts = await setupAccounts() + }) + + it('should proxy function to calculator', async () => { + const { stateChanges } = await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { + function: 'invest', + args: [] + }, + chainId + }, accounts.user1.seed)) + const targetCall = stateChanges.invokes[0].call + expect(targetCall.function).to.equal('invest') + expect(targetCall.args[0].type).to.equal('ByteVector') + expect(targetCall.args[0].value).to.equal(accounts.user1.address) + }) +}) From a2c1bffdc800d4578ea0b6c0817fedfe736aa017 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 2 Jun 2023 14:21:55 +0500 Subject: [PATCH 020/143] invest draft --- contracts/calculator/calculator.ride | 34 +++++++++++++++++++++++++++- contracts/factory/factory.ride | 1 + 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 369c656..8e8a80b 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -4,6 +4,7 @@ let SEP = "__" let contractFilename = "calculator.ride" +let priceScale = 100_000_000 func wrapErr(s: String) = { contractFilename + ": " + s @@ -15,8 +16,11 @@ func throwErr(s: String) = { func keyFactoryAddress() = "%s__factory" func keyLpAssetId() = "%s__lpAssetId" +func keyTreasuryAddress() = "%s__treasury" func keyAvailable(userAddress: Address) = "%s%s__available__" + userAddress.toString() func keyClaimed(userAddress: Address) = "%s%s__claimed__" + userAddress.toString() +func keyCurrentPeriod() = "%s__currentPeriod" +func keyPriceForPeriod(period: Int) = "%s%d__price__" + period.toString() let factoryAddressOption = match this.getString(keyFactoryAddress()) { case s: String => s.addressFromString() @@ -33,6 +37,15 @@ let lpAssetIdOption = match factoryAddressOption { } let lpAssetIdOrFail = lpAssetIdOption.valueOrErrorMessage(wrapErr("invalid lpAssetId")) +let treasuryAddressOption = match factoryAddressOption { + case a: Address => match a.getString(keyTreasuryAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit + } + case _: Unit => unit +} +let treasuryAddressOrFail = treasuryAddressOption.valueOrErrorMessage(wrapErr("invalid treasury address")) + func onlyAddress(i: Invocation, address: Address) = { i.caller == address || throwErr("permission denied") } @@ -83,9 +96,28 @@ func claimWaves(userAddressBytes: ByteVector, epoch: Int) = { (nil, unit) } +# payment in waves @Callable(i) func invest(userAddressBytes: ByteVector) = { - (nil, unit) + let userAddress = Address(userAddressBytes) + let currentPeriodOrFail = + factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage("invalid period") + let currentPriceOrFail = + factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage("invalid price") + let payment = if (i.payments.size() == 1) then i.payments[0] else throwErr("invalid payments") + let paymentAssetId = if (payment.assetId == unit) then unit else throwErr("invalid payment asset") + let paymentAmount = if (payment.amount > 0) then payment.amount else throwErr("invalid payment amount") + let lpAssetAmount = if (currentPriceOrFail > 0) then fraction(paymentAmount, priceScale, currentPriceOrFail) else 0 + + # TODO: increase invested amount + strict stateMutations = [ + factoryAddressOrFail.invoke("integerEntry", ["invested__WAVES", 0], []) + ] + + ([ + ScriptTransfer(userAddress, lpAssetAmount, lpAssetIdOrFail), + ScriptTransfer(treasuryAddressOrFail, paymentAmount, paymentAssetId) + ], lpAssetAmount) } @Callable(i) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 6d75171..bd9b8cb 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -104,6 +104,7 @@ func binaryEntry(key: String, val: ByteVector) = func deleteEntry(key: String) = if (i.onlyCalculator()) then ([DeleteEntry(key)], key) else ([], unit) + @Callable(i) func emit(amount: Int) = { strict checkCaller = i.onlyCalculator() From 8f0450a45e57f11191e1420c5dc4322da13654a9 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 2 Jun 2023 14:50:57 +0500 Subject: [PATCH 021/143] withdraw draft --- contracts/calculator/calculator.ride | 46 ++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 8e8a80b..db8ac9b 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -3,24 +3,30 @@ {-# SCRIPT_TYPE ACCOUNT #-} let SEP = "__" -let contractFilename = "calculator.ride" -let priceScale = 100_000_000 +let CONTRACT_NAME = "calculator.ride" +let PRICE_SCALE = 100_000_000 +let PENDING = "PENDING" +let FINISHED = "FINISHED" func wrapErr(s: String) = { - contractFilename + ": " + s + CONTRACT_NAME + ": " + s } func throwErr(s: String) = { throw(wrapErr(s)) } -func keyFactoryAddress() = "%s__factory" -func keyLpAssetId() = "%s__lpAssetId" -func keyTreasuryAddress() = "%s__treasury" -func keyAvailable(userAddress: Address) = "%s%s__available__" + userAddress.toString() -func keyClaimed(userAddress: Address) = "%s%s__claimed__" + userAddress.toString() -func keyCurrentPeriod() = "%s__currentPeriod" -func keyPriceForPeriod(period: Int) = "%s%d__price__" + period.toString() +func keyFactoryAddress() = ["%s", "factory"].makeString(SEP) +func keyLpAssetId() = ["%s", "lpAssetId"].makeString(SEP) +func keyTreasuryAddress() = ["%s", "treasury"].makeString(SEP) +func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toString()].makeString(SEP) +func keyClaimed(userAddress: Address) = ["%s%s", "claimed", userAddress.toString()].makeString(SEP) +func keyCurrentPeriod() = ["%s", "currentPeriod"].makeString(SEP) +func keyPriceForPeriod(period: Int) = ["%s%d", "price", period.toString()].makeString(SEP) +func keyWithdrawalRequest(userAddress: Address, txId: ByteVector) = + ["%s%s%s", "withdrawal", userAddress.toString(), txId.toBase58String()].makeString(SEP) +func valueWithdrawalRequest(status: String, lpAssetAmount: Int, targetPeriod: Int, claimTxId: String|Unit) = + ["%s%d%d%s", status, lpAssetAmount.toString(), targetPeriod.toString(), claimTxId.valueOrElse("SOON")].makeString(SEP) let factoryAddressOption = match this.getString(keyFactoryAddress()) { case s: String => s.addressFromString() @@ -107,7 +113,7 @@ func invest(userAddressBytes: ByteVector) = { let payment = if (i.payments.size() == 1) then i.payments[0] else throwErr("invalid payments") let paymentAssetId = if (payment.assetId == unit) then unit else throwErr("invalid payment asset") let paymentAmount = if (payment.amount > 0) then payment.amount else throwErr("invalid payment amount") - let lpAssetAmount = if (currentPriceOrFail > 0) then fraction(paymentAmount, priceScale, currentPriceOrFail) else 0 + let lpAssetAmount = if (currentPriceOrFail > 0) then fraction(paymentAmount, PRICE_SCALE, currentPriceOrFail) else 0 # TODO: increase invested amount strict stateMutations = [ @@ -122,7 +128,23 @@ func invest(userAddressBytes: ByteVector) = { @Callable(i) func withdraw(userAddressBytes: ByteVector) = { - (nil, unit) + let userAddress = Address(userAddressBytes) + let currentPeriodOrFail = + factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage("invalid period") + let payment = if (i.payments.size() == 1) then i.payments[0] else throwErr("invalid payments") + let paymentAssetId = if (payment.assetId == lpAssetIdOrFail) then lpAssetIdOrFail else throwErr("invalid payment asset") + let paymentAmount = if (payment.amount > 0) then payment.amount else throwErr("invalid payment amount") + + strict stateMutations = [ + factoryAddressOrFail.invoke("stringEntry", [ + keyWithdrawalRequest(userAddress, i.transactionId), + valueWithdrawalRequest(PENDING, paymentAmount, currentPeriodOrFail + 1, unit) + ], []) + ] + + ([ + ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId) + ], unit) } @Callable(i) From 40e17d90ae63d0b13830dc0b5ab31e44df277212 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 2 Jun 2023 15:12:55 +0500 Subject: [PATCH 022/143] cancelWithdraw --- contracts/calculator/calculator.ride | 39 ++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index db8ac9b..6f345f0 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -27,6 +27,18 @@ func keyWithdrawalRequest(userAddress: Address, txId: ByteVector) = ["%s%s%s", "withdrawal", userAddress.toString(), txId.toBase58String()].makeString(SEP) func valueWithdrawalRequest(status: String, lpAssetAmount: Int, targetPeriod: Int, claimTxId: String|Unit) = ["%s%d%d%s", status, lpAssetAmount.toString(), targetPeriod.toString(), claimTxId.valueOrElse("SOON")].makeString(SEP) +func parseWithdrawalRequestValueOrFail(s: String) = { + let parts = s.split(SEP) + if (parts.size() == 5) then { + let status = parts[1] + let lpAssetAmount = parts[2].parseInt().valueOrErrorMessage("invalid lpAssetAmount") + let targetPeriod = parts[3].parseInt().valueOrErrorMessage("invalid targetPeriod") + let claimTxId = parts[4] + (status, lpAssetAmount, targetPeriod, claimTxId) + } else { + throwErr("invalid withdrawal request value") + } +} let factoryAddressOption = match this.getString(keyFactoryAddress()) { case s: String => s.addressFromString() @@ -97,11 +109,6 @@ func finalize( (nil, unit) } -@Callable(i) -func claimWaves(userAddressBytes: ByteVector, epoch: Int) = { - (nil, unit) -} - # payment in waves @Callable(i) func invest(userAddressBytes: ByteVector) = { @@ -135,6 +142,7 @@ func withdraw(userAddressBytes: ByteVector) = { let paymentAssetId = if (payment.assetId == lpAssetIdOrFail) then lpAssetIdOrFail else throwErr("invalid payment asset") let paymentAmount = if (payment.amount > 0) then payment.amount else throwErr("invalid payment amount") + # TODO: increase total withdrawal amount strict stateMutations = [ factoryAddressOrFail.invoke("stringEntry", [ keyWithdrawalRequest(userAddress, i.transactionId), @@ -149,6 +157,27 @@ func withdraw(userAddressBytes: ByteVector) = { @Callable(i) func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { + let userAddress = Address(userAddressBytes) + let withdrawalRequestOption = factoryAddressOrFail + .getString(keyWithdrawalRequest(userAddress, txId)) + .valueOrErrorMessage("invalid withdrawal request") + let (status, lpAssetAmount, targetPeriod, claimTxId) = parseWithdrawalRequestValueOrFail(withdrawalRequestOption) + if (status == PENDING) then { + strict stateMutations = [ + factoryAddressOrFail.invoke("deleteEntry", [ + keyWithdrawalRequest(userAddress, txId) + ], []) + ] + ([ + ScriptTransfer(userAddress, lpAssetAmount, lpAssetIdOrFail) + ], unit) + } else { + throwErr("invalid withdrawal request status") + } +} + +@Callable(i) +func claimWaves(userAddressBytes: ByteVector, epoch: Int) = { (nil, unit) } From f4caed7706647042c1c31966fbbec3d3f2229155 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 2 Jun 2023 17:23:33 +0500 Subject: [PATCH 023/143] claimWaves draft --- contracts/calculator/calculator.ride | 39 +++++++++++++++++++++++++--- contracts/factory/factory.ride | 4 +-- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 6f345f0..22b7938 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -25,8 +25,13 @@ func keyCurrentPeriod() = ["%s", "currentPeriod"].makeString(SEP) func keyPriceForPeriod(period: Int) = ["%s%d", "price", period.toString()].makeString(SEP) func keyWithdrawalRequest(userAddress: Address, txId: ByteVector) = ["%s%s%s", "withdrawal", userAddress.toString(), txId.toBase58String()].makeString(SEP) -func valueWithdrawalRequest(status: String, lpAssetAmount: Int, targetPeriod: Int, claimTxId: String|Unit) = - ["%s%d%d%s", status, lpAssetAmount.toString(), targetPeriod.toString(), claimTxId.valueOrElse("SOON")].makeString(SEP) +func valueWithdrawalRequest(status: String, lpAssetAmount: Int, targetPeriod: Int, claimTxId: ByteVector|Unit) = { + let claimTxIdStr = match claimTxId { + case b: ByteVector => b.toBase58String() + case _: Unit => "SOON" + } + ["%s%d%d%s", status, lpAssetAmount.toString(), targetPeriod.toString(), claimTxIdStr].makeString(SEP) +} func parseWithdrawalRequestValueOrFail(s: String) = { let parts = s.split(SEP) if (parts.size() == 5) then { @@ -127,6 +132,7 @@ func invest(userAddressBytes: ByteVector) = { factoryAddressOrFail.invoke("integerEntry", ["invested__WAVES", 0], []) ] + # TODO: emit lp tokens ([ ScriptTransfer(userAddress, lpAssetAmount, lpAssetIdOrFail), ScriptTransfer(treasuryAddressOrFail, paymentAmount, paymentAssetId) @@ -177,8 +183,33 @@ func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { } @Callable(i) -func claimWaves(userAddressBytes: ByteVector, epoch: Int) = { - (nil, unit) +func claimWaves(userAddressBytes: ByteVector, txId: ByteVector) = { + let userAddress = Address(userAddressBytes) + let currentPeriodOrFail = + factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage("invalid period") + let withdrawalRequestOption = factoryAddressOrFail + .getString(keyWithdrawalRequest(userAddress, txId)) + .valueOrErrorMessage("invalid withdrawal request") + let (status, lpAssetAmount, targetPeriod, claimTxId) = parseWithdrawalRequestValueOrFail(withdrawalRequestOption) + if (status == FINISHED) then { + throwErr("invalid withdrawal request status") + } else if (currentPeriodOrFail < targetPeriod) then { + throwErr("invalid withdrawal request period") + } else { + # TODO: burn lp tokens + let stateMutations = [ + factoryAddressOrFail.invoke("stringEntry", [ + keyWithdrawalRequest(userAddress, txId), + valueWithdrawalRequest(FINISHED, lpAssetAmount, targetPeriod, i.transactionId) + ], []) + ] + let currentPriceOrFail = + factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage("invalid price") + let amount = if (currentPriceOrFail > 0) then fraction(lpAssetAmount, currentPriceOrFail, PRICE_SCALE) else 0 + ([ + ScriptTransfer(userAddress, amount, unit) + ], stateMutations) + } } @Verifier(tx) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index bd9b8cb..0060e47 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -122,8 +122,8 @@ func claimLP() = (nil, calculatorAddressOrFail.invoke("claimLP", [i.caller.bytes], i.payments)) @Callable(i) -func claimWaves(epoch: Int) = - (nil, calculatorAddressOrFail.invoke("claimWaves", [i.caller.bytes, epoch], i.payments)) +func claimWaves(txIdStr: String) = + (nil, calculatorAddressOrFail.invoke("claimWaves", [i.caller.bytes, txIdStr.fromBase58String()], i.payments)) @Callable(i) func invest() = From 3cd20dfe83f0014f59d45a7a646752bb1a304330 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 2 Jun 2023 17:27:48 +0500 Subject: [PATCH 024/143] burn, reissue --- contracts/factory/factory.ride | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 0060e47..7388e88 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -72,6 +72,12 @@ let childrenAddressOption = match configAddressOption { } let childrenAddressOrFail = childrenAddressOption.valueOrErrorMessage(wrapErr("invalid children address")) +let lpAssetIdOption = match this.getString(keyLpAssetId()) { + case s: String => s.fromBase58String() + case _: Unit => unit +} +let lpAssetIdOrFail = lpAssetIdOption.valueOrErrorMessage(wrapErr("invalid lpAssetId")) + func onlyAddress(i: Invocation, address: Address) = { i.caller == address || throwErr("permission denied") } @@ -104,13 +110,13 @@ func binaryEntry(key: String, val: ByteVector) = func deleteEntry(key: String) = if (i.onlyCalculator()) then ([DeleteEntry(key)], key) else ([], unit) - @Callable(i) -func emit(amount: Int) = { - strict checkCaller = i.onlyCalculator() +func reissue(amount: Int) = + if (i.onlyCalculator()) then ([Reissue(lpAssetIdOrFail, amount, true)], amount) else ([], unit) - (nil, unit) -} +@Callable(i) +func burn(amount: Int) = + if (i.onlyCalculator()) then ([Burn(lpAssetIdOrFail, amount)], amount) else ([], unit) # finalize period @Callable(i) From 7da7abfbb353fae032af32b605193616650f7fca Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 2 Jun 2023 18:58:39 +0500 Subject: [PATCH 025/143] fix transfers --- contracts/calculator/calculator.ride | 72 ++++++++++++++++------------ contracts/factory/factory.ride | 8 ++++ 2 files changed, 50 insertions(+), 30 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 22b7938..c5b39e5 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -94,13 +94,21 @@ func claimLP(userAddressBytes: ByteVector) = { let userAddress = Address(userAddressBytes) let available = factoryAddressOrFail.getInteger(keyAvailable(userAddress)).valueOrElse(0) let claimed = factoryAddressOrFail.getInteger(keyClaimed(userAddress)).valueOrElse(0) - let actions = if (available > 0) then [ - ScriptTransfer(userAddress, available, lpAssetIdOrFail), - IntegerEntry(keyAvailable(userAddress), 0), - IntegerEntry(keyClaimed(userAddress), claimed + available) + let factoryActions = if (available > 0) then [ + factoryAddressOrFail.invoke("transferAsset", [ + userAddressBytes, available, lpAssetIdOrFail + ], []), + factoryAddressOrFail.invoke("integerEntry", [ + keyAvailable(userAddress), + 0 + ], []), + factoryAddressOrFail.invoke("stringEntry", [ + keyClaimed(userAddress), + claimed + available + ], []) ] else [] - (actions, available) + (nil, factoryActions) } # payment in waves to fulfill all withdrawal requests @@ -123,20 +131,24 @@ func invest(userAddressBytes: ByteVector) = { let currentPriceOrFail = factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage("invalid price") let payment = if (i.payments.size() == 1) then i.payments[0] else throwErr("invalid payments") - let paymentAssetId = if (payment.assetId == unit) then unit else throwErr("invalid payment asset") - let paymentAmount = if (payment.amount > 0) then payment.amount else throwErr("invalid payment amount") + let paymentAmount = if (payment.assetId == unit && payment.amount > 0) then { + payment.amount + } else throwErr("invalid payment amount") let lpAssetAmount = if (currentPriceOrFail > 0) then fraction(paymentAmount, PRICE_SCALE, currentPriceOrFail) else 0 - # TODO: increase invested amount - strict stateMutations = [ - factoryAddressOrFail.invoke("integerEntry", ["invested__WAVES", 0], []) + let factoryActions = [ + # TODO: increase invested amount + factoryAddressOrFail.invoke("integerEntry", ["invested__WAVES", 0], []), + factoryAddressOrFail.invoke("reissue", [lpAssetAmount], []), + factoryAddressOrFail.invoke("transferAsset", [ + userAddressBytes, lpAssetAmount, lpAssetIdOrFail + ], []), + factoryAddressOrFail.invoke("transferWaves", [ + treasuryAddressOrFail.bytes, paymentAmount + ], [AttachedPayment(unit, paymentAmount)]) ] - # TODO: emit lp tokens - ([ - ScriptTransfer(userAddress, lpAssetAmount, lpAssetIdOrFail), - ScriptTransfer(treasuryAddressOrFail, paymentAmount, paymentAssetId) - ], lpAssetAmount) + (nil, factoryActions) } @Callable(i) @@ -149,7 +161,7 @@ func withdraw(userAddressBytes: ByteVector) = { let paymentAmount = if (payment.amount > 0) then payment.amount else throwErr("invalid payment amount") # TODO: increase total withdrawal amount - strict stateMutations = [ + strict factoryActions = [ factoryAddressOrFail.invoke("stringEntry", [ keyWithdrawalRequest(userAddress, i.transactionId), valueWithdrawalRequest(PENDING, paymentAmount, currentPeriodOrFail + 1, unit) @@ -158,7 +170,7 @@ func withdraw(userAddressBytes: ByteVector) = { ([ ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId) - ], unit) + ], factoryActions) } @Callable(i) @@ -169,14 +181,15 @@ func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { .valueOrErrorMessage("invalid withdrawal request") let (status, lpAssetAmount, targetPeriod, claimTxId) = parseWithdrawalRequestValueOrFail(withdrawalRequestOption) if (status == PENDING) then { - strict stateMutations = [ + strict factoryActions = [ factoryAddressOrFail.invoke("deleteEntry", [ keyWithdrawalRequest(userAddress, txId) + ], []), + factoryAddressOrFail.invoke("transferAsset", [ + userAddressBytes, lpAssetAmount, lpAssetIdOrFail ], []) ] - ([ - ScriptTransfer(userAddress, lpAssetAmount, lpAssetIdOrFail) - ], unit) + (nil, factoryActions) } else { throwErr("invalid withdrawal request status") } @@ -196,19 +209,18 @@ func claimWaves(userAddressBytes: ByteVector, txId: ByteVector) = { } else if (currentPeriodOrFail < targetPeriod) then { throwErr("invalid withdrawal request period") } else { - # TODO: burn lp tokens - let stateMutations = [ + let currentPriceOrFail = + factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage("invalid price") + let amount = if (currentPriceOrFail > 0) then fraction(lpAssetAmount, currentPriceOrFail, PRICE_SCALE) else 0 + let factoryActions = [ factoryAddressOrFail.invoke("stringEntry", [ keyWithdrawalRequest(userAddress, txId), valueWithdrawalRequest(FINISHED, lpAssetAmount, targetPeriod, i.transactionId) - ], []) + ], []), + factoryAddressOrFail.invoke("burn", [lpAssetAmount], []), + factoryAddressOrFail.invoke("transferWaves", [userAddressBytes, amount], []) ] - let currentPriceOrFail = - factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage("invalid price") - let amount = if (currentPriceOrFail > 0) then fraction(lpAssetAmount, currentPriceOrFail, PRICE_SCALE) else 0 - ([ - ScriptTransfer(userAddress, amount, unit) - ], stateMutations) + (nil, factoryActions) } } diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 7388e88..29a0906 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -118,6 +118,14 @@ func reissue(amount: Int) = func burn(amount: Int) = if (i.onlyCalculator()) then ([Burn(lpAssetIdOrFail, amount)], amount) else ([], unit) +@Callable(i) +func transferAsset(recepientBytes: ByteVector, amount: Int, assetId: ByteVector) = + if (i.onlyCalculator()) then ([ScriptTransfer(Address(recepientBytes), amount, assetId)], amount) else ([], unit) + +@Callable(i) +func transferWaves(recepientBytes: ByteVector, amount: Int) = + if (i.onlyCalculator()) then ([ScriptTransfer(Address(recepientBytes), amount, unit)], amount) else ([], unit) + # finalize period @Callable(i) func finalize() = From 4d7d77a374065e5dfbb4fee2c66d71593f478152 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Mon, 5 Jun 2023 12:32:59 +0500 Subject: [PATCH 026/143] check caller in calculator functions --- contracts/calculator/calculator.ride | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index c5b39e5..085060c 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -119,12 +119,14 @@ func finalize( pwrManagersBonus: Int, # 0..1×10⁸ treasuryVolumeDiffAllocationCoef: Int # -1..1×10⁸ ) = { + strict checkCaller = i.onlyFactory() (nil, unit) } # payment in waves @Callable(i) func invest(userAddressBytes: ByteVector) = { + strict checkCaller = i.onlyFactory() let userAddress = Address(userAddressBytes) let currentPeriodOrFail = factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage("invalid period") @@ -153,6 +155,7 @@ func invest(userAddressBytes: ByteVector) = { @Callable(i) func withdraw(userAddressBytes: ByteVector) = { + strict checkCaller = i.onlyFactory() let userAddress = Address(userAddressBytes) let currentPeriodOrFail = factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage("invalid period") @@ -175,6 +178,7 @@ func withdraw(userAddressBytes: ByteVector) = { @Callable(i) func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { + strict checkCaller = i.onlyFactory() let userAddress = Address(userAddressBytes) let withdrawalRequestOption = factoryAddressOrFail .getString(keyWithdrawalRequest(userAddress, txId)) @@ -197,6 +201,7 @@ func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { @Callable(i) func claimWaves(userAddressBytes: ByteVector, txId: ByteVector) = { + strict checkCaller = i.onlyFactory() let userAddress = Address(userAddressBytes) let currentPeriodOrFail = factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage("invalid period") From ce8da63e28244fb18ee866e34f89ce54d1f8b217 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Mon, 5 Jun 2023 16:07:17 +0500 Subject: [PATCH 027/143] =?UTF-8?q?price=20scale=20=E2=86=92=20scale8,=20f?= =?UTF-8?q?inalize=20args=20checks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contracts/calculator/calculator.ride | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 085060c..a803b41 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -4,7 +4,7 @@ let SEP = "__" let CONTRACT_NAME = "calculator.ride" -let PRICE_SCALE = 100_000_000 +let SCALE8 = 100_000_000 let PENDING = "PENDING" let FINISHED = "FINISHED" @@ -119,7 +119,18 @@ func finalize( pwrManagersBonus: Int, # 0..1×10⁸ treasuryVolumeDiffAllocationCoef: Int # -1..1×10⁸ ) = { - strict checkCaller = i.onlyFactory() + strict checks = [ + i.originCaller == factoryAddressOrFail || throwErr("permission denied"), + newTreasuryVolumeInWaves >= 0 || throwErr("invalid new treasury volume"), + xtnPrice >= 0 || throwErr("invalid XTN price"), + pwrManagersBonus >= 0 && pwrManagersBonus <= SCALE8 || throwErr("invalid PWR managers bonus"), + treasuryVolumeDiffAllocationCoef >= -SCALE8 && treasuryVolumeDiffAllocationCoef <= SCALE8 + || throwErr("invalid treasury volume diff allocation coefficient") + ] + let currentPeriodOrFail = + factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage("invalid period") + # update current period + # update price for current period (nil, unit) } @@ -136,7 +147,7 @@ func invest(userAddressBytes: ByteVector) = { let paymentAmount = if (payment.assetId == unit && payment.amount > 0) then { payment.amount } else throwErr("invalid payment amount") - let lpAssetAmount = if (currentPriceOrFail > 0) then fraction(paymentAmount, PRICE_SCALE, currentPriceOrFail) else 0 + let lpAssetAmount = if (currentPriceOrFail > 0) then fraction(paymentAmount, SCALE8, currentPriceOrFail) else 0 let factoryActions = [ # TODO: increase invested amount @@ -216,7 +227,7 @@ func claimWaves(userAddressBytes: ByteVector, txId: ByteVector) = { } else { let currentPriceOrFail = factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage("invalid price") - let amount = if (currentPriceOrFail > 0) then fraction(lpAssetAmount, currentPriceOrFail, PRICE_SCALE) else 0 + let amount = if (currentPriceOrFail > 0) then fraction(lpAssetAmount, currentPriceOrFail, SCALE8) else 0 let factoryActions = [ factoryAddressOrFail.invoke("stringEntry", [ keyWithdrawalRequest(userAddress, txId), From 75a918c208f9b60143346696f4b799dabd0f6bc5 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Mon, 5 Jun 2023 16:34:29 +0500 Subject: [PATCH 028/143] finalize draft update --- contracts/calculator/calculator.ride | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index a803b41..9f60da8 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -129,9 +129,28 @@ func finalize( ] let currentPeriodOrFail = factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage("invalid period") - # update current period - # update price for current period - (nil, unit) + let newPeriod = currentPeriodOrFail + 1 + # TODO: calculate new price + let newPrice = SCALE8 + + # TODO: burn total withdrawal amount + let lpAssetAmountToBurn = 0 + + let factoryActions = [ + # update period + factoryAddressOrFail.invoke("integerEntry", [keyCurrentPeriod(), newPeriod], []), + # update price + factoryAddressOrFail.invoke("integerEntry", [keyPriceForPeriod(newPeriod), newPrice], []), + factoryAddressOrFail.invoke("burn", [lpAssetAmountToBurn], []) + # factoryAddressOrFail.invoke("transferAsset", [ + # userAddressBytes, lpAssetAmount, lpAssetIdOrFail + # ], []), + # factoryAddressOrFail.invoke("transferWaves", [ + # treasuryAddressOrFail.bytes, paymentAmount + # ], [AttachedPayment(unit, paymentAmount)]) + ] + + (nil, factoryActions) } # payment in waves From 9cfc85df989939f26a1137ff3e22df84ecee5b5f Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Mon, 5 Jun 2023 16:48:22 +0500 Subject: [PATCH 029/143] processBlocks draft --- contracts/calculator/calculator.ride | 7 +++++++ contracts/factory/factory.md | 11 ++++++----- contracts/factory/factory.ride | 4 ++++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 9f60da8..f8098ac 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -259,6 +259,13 @@ func claimWaves(userAddressBytes: ByteVector, txId: ByteVector) = { } } +@Callable(i) +func processBlocks(userAddressBytes: ByteVector) = { + strict checkCaller = i.onlyFactory() + + (nil, unit) +} + @Verifier(tx) func verify() = { false diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index 1c73b4b..9abdab8 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -1,7 +1,8 @@ ### Required state entries -| key | type | -| :--------------- | :------- | -| `%s__calculator` | `String` | -| `%s__treasury` | `String` | -| `%s__lpAssetId` | `String` | +| key | type | +| :------------------------------------------ | :------- | +| `%s__calculator` | `String` | +| `%s__treasury` | `String` | +| `%s__lpAssetId` | `String` | +| `%s__keyBlockRewardDistributionStartHeight` | `Int` | diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 29a0906..f63cdd8 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -16,6 +16,10 @@ func throwErr(s: String) = { func keyCalculatorAddress() = "%s__calculator" func keyTreasuryAddress() = "%s__treasury" # 3PEgG7eZHLFhcfsTSaYxgRhZsh4AxMvA4Ms func keyChildAddress() = "%s__child" # 3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h +# feature 19 activation height +func keyBlockRewardDistributionStartHeight() = "%s__blockRewardDistributionStartHeight" +# 0.005 waves to compensate the cost of the transaction +func keyBlockProcessingReward() = "%s__blockProcessingReward" func keyLpAssetId() = "%s__lpAssetId" From 441c1fb404963dfb2d812bf21bd4cfe812fc7a3e Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Mon, 5 Jun 2023 19:42:49 +0500 Subject: [PATCH 030/143] processBlocks draft --- contracts/calculator/calculator.ride | 74 ++++++++++++++++++++++------ contracts/factory/factory.ride | 1 + 2 files changed, 61 insertions(+), 14 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index f8098ac..def5a86 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -1,4 +1,4 @@ -{-# STDLIB_VERSION 6 #-} +{-# STDLIB_VERSION 7 #-} {-# CONTENT_TYPE DAPP #-} {-# SCRIPT_TYPE ACCOUNT #-} @@ -23,6 +23,9 @@ func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toSt func keyClaimed(userAddress: Address) = ["%s%s", "claimed", userAddress.toString()].makeString(SEP) func keyCurrentPeriod() = ["%s", "currentPeriod"].makeString(SEP) func keyPriceForPeriod(period: Int) = ["%s%d", "price", period.toString()].makeString(SEP) +func keyBlockRewardDistributionStartHeight() = "%s__blockRewardDistributionStartHeight" +func keyBlockProcessingReward() = "%s__blockProcessingReward" +func keyLastProcessedBlock() = "%s__lastProcessedBlock" func keyWithdrawalRequest(userAddress: Address, txId: ByteVector) = ["%s%s%s", "withdrawal", userAddress.toString(), txId.toBase58String()].makeString(SEP) func valueWithdrawalRequest(status: String, lpAssetAmount: Int, targetPeriod: Int, claimTxId: ByteVector|Unit) = { @@ -36,8 +39,8 @@ func parseWithdrawalRequestValueOrFail(s: String) = { let parts = s.split(SEP) if (parts.size() == 5) then { let status = parts[1] - let lpAssetAmount = parts[2].parseInt().valueOrErrorMessage("invalid lpAssetAmount") - let targetPeriod = parts[3].parseInt().valueOrErrorMessage("invalid targetPeriod") + let lpAssetAmount = parts[2].parseInt().valueOrErrorMessage(wrapErr("invalid lpAssetAmount")) + let targetPeriod = parts[3].parseInt().valueOrErrorMessage(wrapErr("invalid targetPeriod")) let claimTxId = parts[4] (status, lpAssetAmount, targetPeriod, claimTxId) } else { @@ -112,6 +115,7 @@ func claimLP(userAddressBytes: ByteVector) = { } # payment in waves to fulfill all withdrawal requests +# TODO: do not finalize if there are unprocessed blocks @Callable(i) func finalize( newTreasuryVolumeInWaves: Int, @@ -128,7 +132,7 @@ func finalize( || throwErr("invalid treasury volume diff allocation coefficient") ] let currentPeriodOrFail = - factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage("invalid period") + factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage(wrapErr("invalid period")) let newPeriod = currentPeriodOrFail + 1 # TODO: calculate new price let newPrice = SCALE8 @@ -159,9 +163,9 @@ func invest(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() let userAddress = Address(userAddressBytes) let currentPeriodOrFail = - factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage("invalid period") + factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage(wrapErr("invalid period")) let currentPriceOrFail = - factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage("invalid price") + factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage(wrapErr("invalid price")) let payment = if (i.payments.size() == 1) then i.payments[0] else throwErr("invalid payments") let paymentAmount = if (payment.assetId == unit && payment.amount > 0) then { payment.amount @@ -188,8 +192,8 @@ func withdraw(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() let userAddress = Address(userAddressBytes) let currentPeriodOrFail = - factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage("invalid period") - let payment = if (i.payments.size() == 1) then i.payments[0] else throwErr("invalid payments") + factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage(wrapErr("invalid period")) + let payment = if (i.payments.size() == 1) then i.payments[0] else throwErr(wrapErr("invalid payments")) let paymentAssetId = if (payment.assetId == lpAssetIdOrFail) then lpAssetIdOrFail else throwErr("invalid payment asset") let paymentAmount = if (payment.amount > 0) then payment.amount else throwErr("invalid payment amount") @@ -212,7 +216,7 @@ func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { let userAddress = Address(userAddressBytes) let withdrawalRequestOption = factoryAddressOrFail .getString(keyWithdrawalRequest(userAddress, txId)) - .valueOrErrorMessage("invalid withdrawal request") + .valueOrErrorMessage(wrapErr("invalid withdrawal request")) let (status, lpAssetAmount, targetPeriod, claimTxId) = parseWithdrawalRequestValueOrFail(withdrawalRequestOption) if (status == PENDING) then { strict factoryActions = [ @@ -234,10 +238,10 @@ func claimWaves(userAddressBytes: ByteVector, txId: ByteVector) = { strict checkCaller = i.onlyFactory() let userAddress = Address(userAddressBytes) let currentPeriodOrFail = - factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage("invalid period") + factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage(wrapErr("invalid period")) let withdrawalRequestOption = factoryAddressOrFail .getString(keyWithdrawalRequest(userAddress, txId)) - .valueOrErrorMessage("invalid withdrawal request") + .valueOrErrorMessage(wrapErr("invalid withdrawal request")) let (status, lpAssetAmount, targetPeriod, claimTxId) = parseWithdrawalRequestValueOrFail(withdrawalRequestOption) if (status == FINISHED) then { throwErr("invalid withdrawal request status") @@ -245,7 +249,7 @@ func claimWaves(userAddressBytes: ByteVector, txId: ByteVector) = { throwErr("invalid withdrawal request period") } else { let currentPriceOrFail = - factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage("invalid price") + factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage(wrapErr("invalid price")) let amount = if (currentPriceOrFail > 0) then fraction(lpAssetAmount, currentPriceOrFail, SCALE8) else 0 let factoryActions = [ factoryAddressOrFail.invoke("stringEntry", [ @@ -262,8 +266,50 @@ func claimWaves(userAddressBytes: ByteVector, txId: ByteVector) = { @Callable(i) func processBlocks(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() - - (nil, unit) + let userAddress = Address(userAddressBytes) + let currentPeriodOrFail = + factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage(wrapErr("invalid period")) + let currentPriceOrFail = + factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage(wrapErr("invalid price")) + let blockDistributionStartHeightOrFail = factoryAddressOrFail + .getInteger(keyBlockRewardDistributionStartHeight()) + .valueOrErrorMessage(wrapErr("invalid block distribution start height")) + let lastProcessedBlock = factoryAddressOrFail + .getInteger(keyLastProcessedBlock()) + .valueOrElse(blockDistributionStartHeightOrFail - 1) + let targetBlock = if (height > lastProcessedBlock) + then lastProcessedBlock + 1 + else throwErr(wrapErr("invalid height")) + let targetBlockInfo = blockInfoByHeight(targetBlock) + let treasuryRewardOption = rewardForOption(targetBlockInfo.rewards, treasuryAddressOrFail) + + # TODO: do not process blocks not in current period + match treasuryRewardOption { + case reward: Int => { + let blockProcessingRewardOrFail = factoryAddressOrFail + .getInteger(keyBlockProcessingReward()) + .valueOrErrorMessage(wrapErr("invalid block processing reward")) + let available = factoryAddressOrFail.getInteger(keyAvailable(userAddress)).valueOrElse(0) + let lpAssetAmount = if (currentPriceOrFail > 0) + then fraction(reward - blockProcessingRewardOrFail, SCALE8, currentPriceOrFail) + else 0 + let factoryActions = [ + factoryAddressOrFail.invoke("integerEntry", [ + keyLastProcessedBlock(), + targetBlock + ], []), + factoryAddressOrFail.invoke("integerEntry", [ + keyAvailable(userAddress), + available + ], []), + factoryAddressOrFail.invoke("transferWaves", [ + userAddressBytes, blockProcessingRewardOrFail + ], []) + ] + (nil, factoryActions) + } + case _: Unit => throwErr(wrapErr("invalid treasury reward")) + } } @Verifier(tx) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index f63cdd8..a3c1479 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -20,6 +20,7 @@ func keyChildAddress() = "%s__child" # 3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h func keyBlockRewardDistributionStartHeight() = "%s__blockRewardDistributionStartHeight" # 0.005 waves to compensate the cost of the transaction func keyBlockProcessingReward() = "%s__blockProcessingReward" +func keyLastProcessedBlock() = "%s__lastProcessedBlock" func keyLpAssetId() = "%s__lpAssetId" From ada145b3e2cefe85b1460873714479b74afb4f6e Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Tue, 6 Jun 2023 17:55:12 +0500 Subject: [PATCH 031/143] next block to process --- contracts/calculator/calculator.ride | 69 ++++++++++++---------------- contracts/factory/factory.md | 12 ++--- contracts/factory/factory.ride | 5 +- 3 files changed, 38 insertions(+), 48 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index def5a86..84bda4c 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -23,9 +23,8 @@ func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toSt func keyClaimed(userAddress: Address) = ["%s%s", "claimed", userAddress.toString()].makeString(SEP) func keyCurrentPeriod() = ["%s", "currentPeriod"].makeString(SEP) func keyPriceForPeriod(period: Int) = ["%s%d", "price", period.toString()].makeString(SEP) -func keyBlockRewardDistributionStartHeight() = "%s__blockRewardDistributionStartHeight" func keyBlockProcessingReward() = "%s__blockProcessingReward" -func keyLastProcessedBlock() = "%s__lastProcessedBlock" +func keyNextBlockToProcess() = "%s__nextBlockToProcess" func keyWithdrawalRequest(userAddress: Address, txId: ByteVector) = ["%s%s%s", "withdrawal", userAddress.toString(), txId.toBase58String()].makeString(SEP) func valueWithdrawalRequest(status: String, lpAssetAmount: Int, targetPeriod: Int, claimTxId: ByteVector|Unit) = { @@ -271,45 +270,37 @@ func processBlocks(userAddressBytes: ByteVector) = { factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage(wrapErr("invalid period")) let currentPriceOrFail = factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage(wrapErr("invalid price")) - let blockDistributionStartHeightOrFail = factoryAddressOrFail - .getInteger(keyBlockRewardDistributionStartHeight()) - .valueOrErrorMessage(wrapErr("invalid block distribution start height")) - let lastProcessedBlock = factoryAddressOrFail - .getInteger(keyLastProcessedBlock()) - .valueOrElse(blockDistributionStartHeightOrFail - 1) - let targetBlock = if (height > lastProcessedBlock) - then lastProcessedBlock + 1 - else throwErr(wrapErr("invalid height")) - let targetBlockInfo = blockInfoByHeight(targetBlock) - let treasuryRewardOption = rewardForOption(targetBlockInfo.rewards, treasuryAddressOrFail) + let nextBlockToProcess = factoryAddressOrFail + .getInteger(keyNextBlockToProcess()) + .valueOrErrorMessage(wrapErr("invalid next block to process")) + let targetBlockInfo = if (height >= nextBlockToProcess) + then blockInfoByHeight(nextBlockToProcess).valueOrErrorMessage(wrapErr("invalid block info")) + else throwErr(wrapErr("invalid target block")) + let treasuryRewardOrFail = rewardForOption(targetBlockInfo.rewards, treasuryAddressOrFail) + .valueOrErrorMessage(wrapErr("invalid treasury reward")) # TODO: do not process blocks not in current period - match treasuryRewardOption { - case reward: Int => { - let blockProcessingRewardOrFail = factoryAddressOrFail - .getInteger(keyBlockProcessingReward()) - .valueOrErrorMessage(wrapErr("invalid block processing reward")) - let available = factoryAddressOrFail.getInteger(keyAvailable(userAddress)).valueOrElse(0) - let lpAssetAmount = if (currentPriceOrFail > 0) - then fraction(reward - blockProcessingRewardOrFail, SCALE8, currentPriceOrFail) - else 0 - let factoryActions = [ - factoryAddressOrFail.invoke("integerEntry", [ - keyLastProcessedBlock(), - targetBlock - ], []), - factoryAddressOrFail.invoke("integerEntry", [ - keyAvailable(userAddress), - available - ], []), - factoryAddressOrFail.invoke("transferWaves", [ - userAddressBytes, blockProcessingRewardOrFail - ], []) - ] - (nil, factoryActions) - } - case _: Unit => throwErr(wrapErr("invalid treasury reward")) - } + let blockProcessingRewardOrFail = factoryAddressOrFail + .getInteger(keyBlockProcessingReward()) + .valueOrErrorMessage(wrapErr("invalid block processing reward")) + let available = factoryAddressOrFail.getInteger(keyAvailable(userAddress)).valueOrElse(0) + let lpAssetAmount = if (currentPriceOrFail > 0) + then fraction(treasuryRewardOrFail - blockProcessingRewardOrFail, SCALE8, currentPriceOrFail) + else 0 + let factoryActions = [ + factoryAddressOrFail.invoke("integerEntry", [ + keyNextBlockToProcess(), + nextBlockToProcess + 1 + ], []), + factoryAddressOrFail.invoke("integerEntry", [ + keyAvailable(userAddress), + available + ], []), + factoryAddressOrFail.invoke("transferWaves", [ + userAddressBytes, blockProcessingRewardOrFail + ], []) + ] + (nil, factoryActions) } @Verifier(tx) diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index 9abdab8..a0f65b3 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -1,8 +1,8 @@ ### Required state entries -| key | type | -| :------------------------------------------ | :------- | -| `%s__calculator` | `String` | -| `%s__treasury` | `String` | -| `%s__lpAssetId` | `String` | -| `%s__keyBlockRewardDistributionStartHeight` | `Int` | +| key | type | +| :----------------------- | :------- | +| `%s__calculator` | `String` | +| `%s__treasury` | `String` | +| `%s__lpAssetId` | `String` | +| `%s__nextBlockToProcess` | `Int` | diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index a3c1479..4e42313 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -16,11 +16,10 @@ func throwErr(s: String) = { func keyCalculatorAddress() = "%s__calculator" func keyTreasuryAddress() = "%s__treasury" # 3PEgG7eZHLFhcfsTSaYxgRhZsh4AxMvA4Ms func keyChildAddress() = "%s__child" # 3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h -# feature 19 activation height -func keyBlockRewardDistributionStartHeight() = "%s__blockRewardDistributionStartHeight" # 0.005 waves to compensate the cost of the transaction func keyBlockProcessingReward() = "%s__blockProcessingReward" -func keyLastProcessedBlock() = "%s__lastProcessedBlock" +# feature 19 activation height should be set initially +func keyNextBlockToProcess() = "%s__nextBlockToProcess" func keyLpAssetId() = "%s__lpAssetId" From 08b0c5246e2bce45c73aedc9d61c908e829ce3a9 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Tue, 6 Jun 2023 19:55:08 +0500 Subject: [PATCH 032/143] start height, period length --- contracts/calculator/calculator.ride | 7 +++++++ contracts/factory/factory.md | 16 ++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 84bda4c..25f57c4 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -23,6 +23,8 @@ func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toSt func keyClaimed(userAddress: Address) = ["%s%s", "claimed", userAddress.toString()].makeString(SEP) func keyCurrentPeriod() = ["%s", "currentPeriod"].makeString(SEP) func keyPriceForPeriod(period: Int) = ["%s%d", "price", period.toString()].makeString(SEP) +func keyStartHeight(period: Int) = ["%s%d", "startHeight", period.toString()].makeString(SEP) +func keyPeriodLength() = "%s__periodLength" func keyBlockProcessingReward() = "%s__blockProcessingReward" func keyNextBlockToProcess() = "%s__nextBlockToProcess" func keyWithdrawalRequest(userAddress: Address, txId: ByteVector) = @@ -268,6 +270,11 @@ func processBlocks(userAddressBytes: ByteVector) = { let userAddress = Address(userAddressBytes) let currentPeriodOrFail = factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage(wrapErr("invalid period")) + let periodLength = + factoryAddressOrFail.getInteger(keyPeriodLength()).valueOrErrorMessage(wrapErr("invalid period length")) + let currentStartHeight = factoryAddressOrFail + .getInteger(keyStartHeight(currentPeriodOrFail)) + .valueOrErrorMessage(wrapErr("invalid start height")) let currentPriceOrFail = factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage(wrapErr("invalid price")) let nextBlockToProcess = factoryAddressOrFail diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index a0f65b3..7a950bb 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -1,8 +1,12 @@ ### Required state entries -| key | type | -| :----------------------- | :------- | -| `%s__calculator` | `String` | -| `%s__treasury` | `String` | -| `%s__lpAssetId` | `String` | -| `%s__nextBlockToProcess` | `Int` | +| key | type | +| :---------------------------- | :------- | +| `%s__calculator` | `String` | +| `%s__treasury` | `String` | +| `%s__lpAssetId` | `String` | +| `%s__currentPeriod` | `Int` | +| `%s__periodLength` | `Int` | +| `%s%d__startHeight__` | `Int` | +| `%s%d__price__` | `Int` | +| `%s__nextBlockToProcess` | `Int` | From 32830b292699fe7229fd33b04301f857b79ce363 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 7 Jun 2023 19:43:10 +0500 Subject: [PATCH 033/143] verify in calculator with sigVerify --- contracts/calculator/calculator.ride | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 25f57c4..d7b9829 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -312,5 +312,5 @@ func processBlocks(userAddressBytes: ByteVector) = { @Verifier(tx) func verify() = { - false + sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) } From 8a7eebbbf83dadb168ccc337df66a353c50205ad Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 7 Jun 2023 19:52:51 +0500 Subject: [PATCH 034/143] do not process blocks not in current period --- contracts/calculator/calculator.ride | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index d7b9829..b7cd987 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -280,13 +280,18 @@ func processBlocks(userAddressBytes: ByteVector) = { let nextBlockToProcess = factoryAddressOrFail .getInteger(keyNextBlockToProcess()) .valueOrErrorMessage(wrapErr("invalid next block to process")) - let targetBlockInfo = if (height >= nextBlockToProcess) + + # do not process blocks not in current period + let targetBlockInfo = if ( + height >= nextBlockToProcess + && (nextBlockToProcess >= currentStartHeight || currentPeriodOrFail == 0) + && nextBlockToProcess < currentStartHeight + periodLength + ) then blockInfoByHeight(nextBlockToProcess).valueOrErrorMessage(wrapErr("invalid block info")) else throwErr(wrapErr("invalid target block")) let treasuryRewardOrFail = rewardForOption(targetBlockInfo.rewards, treasuryAddressOrFail) .valueOrErrorMessage(wrapErr("invalid treasury reward")) - # TODO: do not process blocks not in current period let blockProcessingRewardOrFail = factoryAddressOrFail .getInteger(keyBlockProcessingReward()) .valueOrErrorMessage(wrapErr("invalid block processing reward")) From d554c4c459b7de4020e21280bb71b147e29593d8 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 8 Jun 2023 12:01:57 +0500 Subject: [PATCH 035/143] finalize not implemented yet throw --- contracts/factory/factory.ride | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 4e42313..fd7ac10 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -133,7 +133,8 @@ func transferWaves(recepientBytes: ByteVector, amount: Int) = # finalize period @Callable(i) func finalize() = - (nil, calculatorAddressOrFail.invoke("finalize", [i.caller.bytes], i.payments)) + throwErr("not implemented yet") + # (nil, calculatorAddressOrFail.invoke("finalize", [i.caller.bytes], i.payments)) @Callable(i) func claimLP() = From 635a3c3852f4905870a8c96ffe0c01b010b3a991 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 8 Jun 2023 13:52:47 +0500 Subject: [PATCH 036/143] deploy script --- .env | 3 - env.js | 13 ++ package.json | 6 +- pnpm-lock.yaml | 569 +++++++++++++++++++++++----------------------- scripts/deploy.js | 23 ++ utils/api.js | 19 +- 6 files changed, 325 insertions(+), 308 deletions(-) delete mode 100644 .env create mode 100644 env.js create mode 100644 scripts/deploy.js diff --git a/.env b/.env deleted file mode 100644 index 89bedb1..0000000 --- a/.env +++ /dev/null @@ -1,3 +0,0 @@ -API_NODE_URL=http://localhost:6869 -CHAIN_ID=R -BASE_SEED=waves private node seed with waves tokens diff --git a/env.js b/env.js new file mode 100644 index 0000000..ab36d72 --- /dev/null +++ b/env.js @@ -0,0 +1,13 @@ +const envs = { + testnet: { + chainId: 'T', + apiBase: 'https://nodes-testnet.wavesnodes.com' + }, + custom: { + chainId: 'R', + apiBase: 'http://localhost:6869', + baseSeed: 'waves private node seed with waves tokens' + } +} + +export const env = (network = 'custom') => envs[network] diff --git a/package.json b/package.json index 50628bb..edce70c 100644 --- a/package.json +++ b/package.json @@ -4,19 +4,19 @@ "version": "1.0.0", "description": "", "scripts": { - "test": "mocha -r dotenv/config" + "test": "NETWORK=custom mocha -r dotenv/config" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "@waves/node-api-js": "^1.3.0", - "@waves/ride-js": "^2.2.5", "@waves/ts-lib-crypto": "1.4.4-beta.1", "@waves/waves-transactions": "^4.2.10", "chai": "^4.3.7", "chai-as-promised": "^7.1.1", - "dotenv": "^16.0.3", + "inquirer": "^9.2.7", + "inquirer-file-tree-selection-prompt": "^2.0.5", "mocha": "^10.2.0", "table": "^6.8.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e11a38..4ae04e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,12 +1,13 @@ -lockfileVersion: '6.0' +lockfileVersion: '6.1' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: '@waves/node-api-js': specifier: ^1.3.0 version: 1.3.0 - '@waves/ride-js': - specifier: ^2.2.5 - version: 2.2.5 '@waves/ts-lib-crypto': specifier: 1.4.4-beta.1 version: 1.4.4-beta.1 @@ -19,9 +20,12 @@ dependencies: chai-as-promised: specifier: ^7.1.1 version: 7.1.1(chai@4.3.7) - dotenv: - specifier: ^16.0.3 - version: 16.0.3 + inquirer: + specifier: ^9.2.7 + version: 9.2.7 + inquirer-file-tree-selection-prompt: + specifier: ^2.0.5 + version: 2.0.5(inquirer@9.2.7) mocha: specifier: ^10.2.0 version: 10.2.0 @@ -48,27 +52,6 @@ devDependencies: packages: - /@babel/code-frame@7.21.4: - resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.18.6 - dev: false - - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: false - /@eslint-community/eslint-utils@4.4.0(eslint@8.41.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -126,48 +109,6 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@jest/environment@27.5.1: - resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 20.2.3 - jest-mock: 27.5.1 - dev: false - - /@jest/fake-timers@27.5.1: - resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@sinonjs/fake-timers': 8.1.0 - '@types/node': 20.2.3 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-util: 27.5.1 - dev: false - - /@jest/globals@27.5.1: - resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/types': 27.5.1 - expect: 27.5.1 - dev: false - - /@jest/types@27.5.1: - resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 20.2.3 - '@types/yargs': 16.0.5 - chalk: 4.1.2 - dev: false - /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -232,38 +173,10 @@ packages: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: false - /@sinonjs/commons@1.8.6: - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} - dependencies: - type-detect: 4.0.8 - dev: false - - /@sinonjs/fake-timers@8.1.0: - resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} - dependencies: - '@sinonjs/commons': 1.8.6 - dev: false - /@types/base64-js@1.3.0: resolution: {integrity: sha512-ZmI0sZGAUNXUfMWboWwi4LcfpoVUYldyN6Oe0oJ5cCsHDU/LlRq8nQKPXhYLOx36QYSW9bNIb1vvRrD6K7Llgw==} dev: false - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: false - - /@types/istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - dev: false - - /@types/istanbul-reports@3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 - dev: false - /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true @@ -283,20 +196,6 @@ packages: resolution: {integrity: sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==} dev: false - /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: false - - /@types/yargs-parser@21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: false - - /@types/yargs@16.0.5: - resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: false - /@waves/bignumber@1.1.1: resolution: {integrity: sha512-WUY0R0y0Rd92nbyQHbIFDXCWh2YMtf5FYtpoTv4yRomM75cRLJ0/NIQ828guUXLKeVytKzWgvDYj1CZfxatDkg==} dependencies: @@ -336,16 +235,6 @@ packages: protobufjs: 6.11.3 dev: false - /@waves/ride-js@2.2.5: - resolution: {integrity: sha512-rmHdnv2sfZKrm9UmhH0TyyJHxXUWcD28Xny4lvHTNLg+Ziwc7yfpKQaHfFPc7ZEUAn9WJcqeUegg7e1NZ1KmTw==} - dependencies: - '@jest/globals': 27.5.1 - '@waves/ts-lib-crypto': 1.4.3 - axios: 0.19.2 - transitivePeerDependencies: - - supports-color - dev: false - /@waves/ts-lib-crypto@1.4.3: resolution: {integrity: sha512-2pKgyvtLapgM5vpaUEYzX7NYe2bkB+HdWn9W/4d7UFKwyg6zoOYhRQWyb6GuLi3OLHTETgiqpcMZvciFA0Ds6g==} dependencies: @@ -416,28 +305,23 @@ packages: engines: {node: '>=6'} dev: false - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} dependencies: - color-convert: 1.9.3 + type-fest: 0.21.3 dev: false + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: false - /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -530,6 +414,14 @@ packages: engines: {node: '>=8'} dev: false + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -553,6 +445,13 @@ packages: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: false + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: @@ -598,15 +497,6 @@ packages: type-detect: 4.0.8 dev: false - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: false - /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -614,6 +504,15 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 + /chalk@5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: false + /check-error@1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} dev: false @@ -633,9 +532,28 @@ packages: fsevents: 2.3.2 dev: false - /ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: false + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: false + + /cli-spinners@2.9.0: + resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} + engines: {node: '>=6'} + dev: false + + /cli-width@4.0.0: + resolution: {integrity: sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==} + engines: {node: '>= 12'} dev: false /cliui@7.0.4: @@ -646,10 +564,9 @@ packages: wrap-ansi: 7.0.0 dev: false - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} dev: false /color-convert@2.0.1: @@ -658,10 +575,6 @@ packages: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: false - /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -734,6 +647,12 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: false + /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} @@ -747,11 +666,6 @@ packages: engines: {node: '>=0.4.0'} dev: false - /diff-sequences@27.5.1: - resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: false - /diff@5.0.0: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} engines: {node: '>=0.3.1'} @@ -771,11 +685,6 @@ packages: esutils: 2.0.3 dev: true - /dotenv@16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} - dev: false - /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: false @@ -849,20 +758,15 @@ packages: engines: {node: '>=6'} dev: false - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: false - - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: false - /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + /eslint-config-standard@17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.41.0): resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} peerDependencies: @@ -1105,14 +1009,13 @@ packages: engines: {node: '>=0.10.0'} dev: true - /expect@27.5.1: - resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} dependencies: - '@jest/types': 27.5.1 - jest-get-type: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 dev: false /fast-deep-equal@3.1.3: @@ -1132,6 +1035,22 @@ packages: reusify: 1.0.4 dev: true + /figures@4.0.1: + resolution: {integrity: sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w==} + engines: {node: '>=12'} + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + dev: false + + /figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + dev: false + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1293,10 +1212,6 @@ packages: get-intrinsic: 1.2.1 dev: true - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: false - /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true @@ -1305,11 +1220,6 @@ packages: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: false - /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1349,6 +1259,17 @@ packages: hasBin: true dev: false + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -1376,6 +1297,40 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /inquirer-file-tree-selection-prompt@2.0.5(inquirer@9.2.7): + resolution: {integrity: sha512-+oLro243KcGT3gnZeGB8H93Ayz6mz/KsnKemzJu/t4/lHuqx/5iyQRh5774gy435aMc5NggLaks3AMOu7pv1Bg==} + engines: {node: '>=14.16'} + peerDependencies: + inquirer: ^9.0.0 + dependencies: + chalk: 5.2.0 + cli-cursor: 4.0.0 + figures: 4.0.1 + inquirer: 9.2.7 + rxjs: 7.8.1 + dev: false + + /inquirer@9.2.7: + resolution: {integrity: sha512-Bf52lnfvNxGPJPltiNO2tLBp3zC339KNlGMqOkW+dsvNikBhcVDK5kqU2lVX2FTPzuXUFX5WJDlsw//w3ZwoTw==} + engines: {node: '>=14.18.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 5.2.0 + cli-cursor: 3.1.0 + cli-width: 4.0.0 + external-editor: 3.1.0 + figures: 5.0.0 + lodash: 4.17.21 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 6.2.0 + dev: false + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} @@ -1447,6 +1402,11 @@ packages: dependencies: is-extglob: 2.1.1 + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: false + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -1518,6 +1478,11 @@ packages: engines: {node: '>=10'} dev: false + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: false + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: @@ -1528,74 +1493,10 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /jest-diff@27.5.1: - resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: false - - /jest-get-type@27.5.1: - resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: false - - /jest-matcher-utils@27.5.1: - resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: false - - /jest-message-util@27.5.1: - resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@babel/code-frame': 7.21.4 - '@jest/types': 27.5.1 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 27.5.1 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: false - - /jest-mock@27.5.1: - resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/node': 20.2.3 - dev: false - - /jest-util@27.5.1: - resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/node': 20.2.3 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: false - /js-sha3@0.8.0: resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} dev: false - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: false - /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -1643,6 +1544,10 @@ packages: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: false + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} @@ -1668,14 +1573,6 @@ packages: yallist: 4.0.0 dev: true - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -1688,6 +1585,11 @@ packages: mime-db: 1.52.0 dev: false + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -1742,6 +1644,11 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + /nanoid@3.3.3: resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1812,6 +1719,13 @@ packages: dependencies: wrappy: 1.0.2 + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} @@ -1824,6 +1738,26 @@ packages: word-wrap: 1.2.3 dev: true + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: false + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: false + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -1874,15 +1808,6 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: false - /protobufjs@6.11.3: resolution: {integrity: sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==} hasBin: true @@ -1917,8 +1842,13 @@ packages: safe-buffer: 5.2.1 dev: false - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 dev: false /readdirp@3.6.0: @@ -1966,6 +1896,22 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -1978,12 +1924,23 @@ packages: glob: 7.2.0 dev: true + /run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + dev: false + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.5.3 + dev: false + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false @@ -1996,6 +1953,10 @@ packages: is-regex: 1.1.4 dev: true + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true @@ -2035,9 +1996,8 @@ packages: object-inspect: 1.12.3 dev: true - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: false /slice-ansi@4.0.0: @@ -2049,13 +2009,6 @@ packages: is-fullwidth-code-point: 3.0.0 dev: false - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: false - /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2090,6 +2043,12 @@ packages: es-abstract: 1.21.2 dev: true + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2105,13 +2064,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: false - /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -2144,6 +2096,17 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: false + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: false + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2164,6 +2127,10 @@ packages: strip-bom: 3.0.0 dev: true + /tslib@2.5.3: + resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + dev: false + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -2181,6 +2148,11 @@ packages: engines: {node: '>=10'} dev: true + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: false + /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: @@ -2207,6 +2179,16 @@ packages: dependencies: punycode: 2.3.0 + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: false + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false @@ -2257,6 +2239,15 @@ packages: resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} dev: false + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} diff --git a/scripts/deploy.js b/scripts/deploy.js new file mode 100644 index 0000000..51e07ef --- /dev/null +++ b/scripts/deploy.js @@ -0,0 +1,23 @@ +import { setScriptFromFile } from '../utils/api.js' +import inquirer from 'inquirer' +import inquirerFileTreeSelection from 'inquirer-file-tree-selection-prompt' + +inquirer.registerPrompt('file-tree-selection', inquirerFileTreeSelection) + +const { rideFilePath, privateKey } = await inquirer.prompt([ + { + type: 'file-tree-selection', + name: 'rideFilePath', + message: 'Select ride file:', + root: 'contracts', + validate: (answer) => /\.ride$/.test(answer) + }, + { + type: 'password', + name: 'privateKey', + message: 'Private key:', + mask: '*' + } +]) + +await setScriptFromFile(rideFilePath, { privateKey }) diff --git a/utils/api.js b/utils/api.js index 9ee670c..ed1e6ce 100644 --- a/utils/api.js +++ b/utils/api.js @@ -1,10 +1,10 @@ import { create } from '@waves/node-api-js' import { nodeInteraction, setScript } from '@waves/waves-transactions' -import ride from '@waves/ride-js' import { readFile } from 'fs/promises' +import { env } from '../env.js' -export const { API_NODE_URL: apiBase, CHAIN_ID: chainId, BASE_SEED: baseSeed } = process.env +export const { apiBase, chainId, baseSeed } = env(process.env.NETWORK) export const api = create(apiBase) export const largeNumbeConvertHeader = { headers: { Accept: 'application/json;large-significand-format=string' } } @@ -33,19 +33,12 @@ export const setScriptFromFile = async ( account, transform = (content) => content ) => { - const { base64, size } = ride.compile(transform(await readFile(path, { encoding: 'utf-8' }))).result - const waveletsPerKilobyte = 1e5 - const bitsInByte = 1024 - const min = 1000000 - let fee = Math.ceil(size / bitsInByte) * waveletsPerKilobyte - if (fee < min) { - fee = min - } - fee += 4e5 + const { script, extraFee, error } = await api.utils.fetchCompileCode(await readFile(path, { encoding: 'utf-8' })) + if (error) throw new Error(error.message) const ssTx = setScript({ - script: base64, + script, chainId, - fee + additionalFee: extraFee }, account) await broadcastAndWait(ssTx) } From b30a0a942b72b2f04523f40c44fd02e8ce2aac1e Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 8 Jun 2023 13:54:07 +0500 Subject: [PATCH 037/143] factory ride 7 --- contracts/factory/factory.ride | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index fd7ac10..645e93b 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -1,4 +1,4 @@ -{-# STDLIB_VERSION 6 #-} +{-# STDLIB_VERSION 7 #-} {-# CONTENT_TYPE DAPP #-} {-# SCRIPT_TYPE ACCOUNT #-} From 68ca8588a45dade9bc1f2cf982a4e91a38d2ff20 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 8 Jun 2023 14:21:15 +0500 Subject: [PATCH 038/143] deploy confirm --- scripts/deploy.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/scripts/deploy.js b/scripts/deploy.js index 51e07ef..f4d4c29 100644 --- a/scripts/deploy.js +++ b/scripts/deploy.js @@ -1,4 +1,5 @@ -import { setScriptFromFile } from '../utils/api.js' +import { chainId, setScriptFromFile } from '../utils/api.js' +import wc from '@waves/ts-lib-crypto' import inquirer from 'inquirer' import inquirerFileTreeSelection from 'inquirer-file-tree-selection-prompt' @@ -20,4 +21,15 @@ const { rideFilePath, privateKey } = await inquirer.prompt([ } ]) -await setScriptFromFile(rideFilePath, { privateKey }) +const publicKey = wc.publicKey({ privateKey }) +const targetAddress = wc.address({ publicKey }, chainId) + +const { confirm } = await inquirer.prompt([ + { + type: 'confirm', + name: 'confirm', + message: `Set script from ${rideFilePath} for ${targetAddress}?` + } +]) + +if (confirm) await setScriptFromFile(rideFilePath, { privateKey }) From a25e15e0991d4789a9530760a16fa6c7a104963f Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 9 Jun 2023 12:48:29 +0500 Subject: [PATCH 039/143] factory reentrantInvoke --- contracts/factory/factory.ride | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 645e93b..47fd323 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -134,31 +134,31 @@ func transferWaves(recepientBytes: ByteVector, amount: Int) = @Callable(i) func finalize() = throwErr("not implemented yet") - # (nil, calculatorAddressOrFail.invoke("finalize", [i.caller.bytes], i.payments)) + # (nil, calculatorAddressOrFail.reentrantInvoke("finalize", [i.caller.bytes], i.payments)) @Callable(i) func claimLP() = - (nil, calculatorAddressOrFail.invoke("claimLP", [i.caller.bytes], i.payments)) + (nil, calculatorAddressOrFail.reentrantInvoke("claimLP", [i.caller.bytes], i.payments)) @Callable(i) func claimWaves(txIdStr: String) = - (nil, calculatorAddressOrFail.invoke("claimWaves", [i.caller.bytes, txIdStr.fromBase58String()], i.payments)) + (nil, calculatorAddressOrFail.reentrantInvoke("claimWaves", [i.caller.bytes, txIdStr.fromBase58String()], i.payments)) @Callable(i) func invest() = - (nil, calculatorAddressOrFail.invoke("invest", [i.caller.bytes], i.payments)) + (nil, calculatorAddressOrFail.reentrantInvoke("invest", [i.caller.bytes], i.payments)) @Callable(i) func withdraw() = - (nil, calculatorAddressOrFail.invoke("withdraw", [i.caller.bytes], i.payments)) + (nil, calculatorAddressOrFail.reentrantInvoke("withdraw", [i.caller.bytes], i.payments)) @Callable(i) func cancelWithdraw(txIdStr: String) = - (nil, calculatorAddressOrFail.invoke("cancelWithdraw", [i.caller.bytes, txIdStr.fromBase58String()], i.payments)) + (nil, calculatorAddressOrFail.reentrantInvoke("cancelWithdraw", [i.caller.bytes, txIdStr.fromBase58String()], i.payments)) # process miners blocks @Callable(i) -func processBlocks() = (nil, calculatorAddressOrFail.invoke("processBlocks", [i.caller.bytes], i.payments)) +func processBlocks() = (nil, calculatorAddressOrFail.reentrantInvoke("processBlocks", [i.caller.bytes], i.payments)) @Verifier(tx) func verify() = { From e4bc12d44edb5a5427602ad090505a00bd5e84aa Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 9 Jun 2023 14:05:59 +0500 Subject: [PATCH 040/143] processBlocks fix --- contracts/calculator/calculator.ride | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index b7cd987..a975eb4 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -92,6 +92,7 @@ func rewardForOption(rewards: List[(Address, Int)], target: Address) = { else unit } +# TODO: reissue lp tokens? @Callable(i) func claimLP(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() @@ -291,11 +292,12 @@ func processBlocks(userAddressBytes: ByteVector) = { else throwErr(wrapErr("invalid target block")) let treasuryRewardOrFail = rewardForOption(targetBlockInfo.rewards, treasuryAddressOrFail) .valueOrErrorMessage(wrapErr("invalid treasury reward")) + let generator = targetBlockInfo.generator let blockProcessingRewardOrFail = factoryAddressOrFail .getInteger(keyBlockProcessingReward()) .valueOrErrorMessage(wrapErr("invalid block processing reward")) - let available = factoryAddressOrFail.getInteger(keyAvailable(userAddress)).valueOrElse(0) + let available = factoryAddressOrFail.getInteger(keyAvailable(generator)).valueOrElse(0) let lpAssetAmount = if (currentPriceOrFail > 0) then fraction(treasuryRewardOrFail - blockProcessingRewardOrFail, SCALE8, currentPriceOrFail) else 0 @@ -305,8 +307,8 @@ func processBlocks(userAddressBytes: ByteVector) = { nextBlockToProcess + 1 ], []), factoryAddressOrFail.invoke("integerEntry", [ - keyAvailable(userAddress), - available + keyAvailable(generator), + available + lpAssetAmount ], []), factoryAddressOrFail.invoke("transferWaves", [ userAddressBytes, blockProcessingRewardOrFail From 7209b4a4b6ca253c15bb3175bb709e8ccc3a6d03 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 9 Jun 2023 14:14:33 +0500 Subject: [PATCH 041/143] nothing to claim error --- contracts/calculator/calculator.ride | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index a975eb4..20ca0ef 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -111,7 +111,7 @@ func claimLP(userAddressBytes: ByteVector) = { keyClaimed(userAddress), claimed + available ], []) - ] else [] + ] else throwErr("nothing to claim") (nil, factoryActions) } From 370a7983e0f3e1fd3b2205b9477ab43fbdff54fe Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 9 Jun 2023 14:51:10 +0500 Subject: [PATCH 042/143] blocks processing batch size key --- contracts/calculator/calculator.ride | 13 ++++++++++--- contracts/factory/factory.ride | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 20ca0ef..36df408 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -27,6 +27,7 @@ func keyStartHeight(period: Int) = ["%s%d", "startHeight", period.toString()].ma func keyPeriodLength() = "%s__periodLength" func keyBlockProcessingReward() = "%s__blockProcessingReward" func keyNextBlockToProcess() = "%s__nextBlockToProcess" +func keyBlocksProcessingBatchSize() = "%s__blocksProcessingBatchSize" func keyWithdrawalRequest(userAddress: Address, txId: ByteVector) = ["%s%s%s", "withdrawal", userAddress.toString(), txId.toBase58String()].makeString(SEP) func valueWithdrawalRequest(status: String, lpAssetAmount: Int, targetPeriod: Int, claimTxId: ByteVector|Unit) = { @@ -269,15 +270,21 @@ func claimWaves(userAddressBytes: ByteVector, txId: ByteVector) = { func processBlocks(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() let userAddress = Address(userAddressBytes) + let blocksProcessingBatchSize = + factoryAddressOrFail.getInteger(keyBlocksProcessingBatchSize()) + .valueOrErrorMessage(wrapErr("invalid batch size")) let currentPeriodOrFail = - factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage(wrapErr("invalid period")) + factoryAddressOrFail.getInteger(keyCurrentPeriod()) + .valueOrErrorMessage(wrapErr("invalid period")) let periodLength = - factoryAddressOrFail.getInteger(keyPeriodLength()).valueOrErrorMessage(wrapErr("invalid period length")) + factoryAddressOrFail.getInteger(keyPeriodLength()) + .valueOrErrorMessage(wrapErr("invalid period length")) let currentStartHeight = factoryAddressOrFail .getInteger(keyStartHeight(currentPeriodOrFail)) .valueOrErrorMessage(wrapErr("invalid start height")) let currentPriceOrFail = - factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage(wrapErr("invalid price")) + factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)) + .valueOrErrorMessage(wrapErr("invalid price")) let nextBlockToProcess = factoryAddressOrFail .getInteger(keyNextBlockToProcess()) .valueOrErrorMessage(wrapErr("invalid next block to process")) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 47fd323..1bf838d 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -20,6 +20,7 @@ func keyChildAddress() = "%s__child" # 3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h func keyBlockProcessingReward() = "%s__blockProcessingReward" # feature 19 activation height should be set initially func keyNextBlockToProcess() = "%s__nextBlockToProcess" +func keyBlocksProcessingBatchSize() = "%s__blocksProcessingBatchSize" func keyLpAssetId() = "%s__lpAssetId" From e54ea63142dea748d177f68e829e03e46c0ba149 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 9 Jun 2023 18:11:12 +0500 Subject: [PATCH 043/143] fix deploy --- scripts/deploy.js | 5 ++++- utils/api.js | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/deploy.js b/scripts/deploy.js index f4d4c29..5a1f93c 100644 --- a/scripts/deploy.js +++ b/scripts/deploy.js @@ -32,4 +32,7 @@ const { confirm } = await inquirer.prompt([ } ]) -if (confirm) await setScriptFromFile(rideFilePath, { privateKey }) +if (confirm) { + const { id } = await setScriptFromFile(rideFilePath, { privateKey }) + console.log(id) +} diff --git a/utils/api.js b/utils/api.js index ed1e6ce..2a537e9 100644 --- a/utils/api.js +++ b/utils/api.js @@ -40,5 +40,5 @@ export const setScriptFromFile = async ( chainId, additionalFee: extraFee }, account) - await broadcastAndWait(ssTx) + return broadcastAndWait(ssTx) } From 45f5ff6c1876f42adae979340c80bbb16f862331 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 9 Jun 2023 19:43:22 +0500 Subject: [PATCH 044/143] batch block processing --- contracts/calculator/calculator.ride | 87 +++++++++++++++++++--------- contracts/factory/factory.ride | 1 - 2 files changed, 59 insertions(+), 29 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 36df408..1461239 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -27,7 +27,7 @@ func keyStartHeight(period: Int) = ["%s%d", "startHeight", period.toString()].ma func keyPeriodLength() = "%s__periodLength" func keyBlockProcessingReward() = "%s__blockProcessingReward" func keyNextBlockToProcess() = "%s__nextBlockToProcess" -func keyBlocksProcessingBatchSize() = "%s__blocksProcessingBatchSize" +func keyBlockProcessed(height: Int) = ["%s%d", "blockProcessed", height.toString()].makeString(SEP) func keyWithdrawalRequest(userAddress: Address, txId: ByteVector) = ["%s%s%s", "withdrawal", userAddress.toString(), txId.toBase58String()].makeString(SEP) func valueWithdrawalRequest(status: String, lpAssetAmount: Int, targetPeriod: Int, claimTxId: ByteVector|Unit) = { @@ -270,9 +270,6 @@ func claimWaves(userAddressBytes: ByteVector, txId: ByteVector) = { func processBlocks(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() let userAddress = Address(userAddressBytes) - let blocksProcessingBatchSize = - factoryAddressOrFail.getInteger(keyBlocksProcessingBatchSize()) - .valueOrErrorMessage(wrapErr("invalid batch size")) let currentPeriodOrFail = factoryAddressOrFail.getInteger(keyCurrentPeriod()) .valueOrErrorMessage(wrapErr("invalid period")) @@ -288,40 +285,74 @@ func processBlocks(userAddressBytes: ByteVector) = { let nextBlockToProcess = factoryAddressOrFail .getInteger(keyNextBlockToProcess()) .valueOrErrorMessage(wrapErr("invalid next block to process")) - + + let periodEndHeight = currentStartHeight + periodLength - 1 + let blocksProcessingBatchSizeMax = 5 + # do not process blocks not in current period - let targetBlockInfo = if ( + let blocksProcessingBatchSize = if ( height >= nextBlockToProcess && (nextBlockToProcess >= currentStartHeight || currentPeriodOrFail == 0) - && nextBlockToProcess < currentStartHeight + periodLength - ) - then blockInfoByHeight(nextBlockToProcess).valueOrErrorMessage(wrapErr("invalid block info")) - else throwErr(wrapErr("invalid target block")) - let treasuryRewardOrFail = rewardForOption(targetBlockInfo.rewards, treasuryAddressOrFail) - .valueOrErrorMessage(wrapErr("invalid treasury reward")) - let generator = targetBlockInfo.generator + && nextBlockToProcess <= periodEndHeight + ) then { + min([periodEndHeight - nextBlockToProcess + 1, blocksProcessingBatchSizeMax]) + } else { + throwErr(wrapErr("invalid target block")) + } - let blockProcessingRewardOrFail = factoryAddressOrFail + let blockProcessingReward = factoryAddressOrFail .getInteger(keyBlockProcessingReward()) .valueOrErrorMessage(wrapErr("invalid block processing reward")) - let available = factoryAddressOrFail.getInteger(keyAvailable(generator)).valueOrElse(0) - let lpAssetAmount = if (currentPriceOrFail > 0) - then fraction(treasuryRewardOrFail - blockProcessingRewardOrFail, SCALE8, currentPriceOrFail) - else 0 - let factoryActions = [ - factoryAddressOrFail.invoke("integerEntry", [ - keyNextBlockToProcess(), - nextBlockToProcess + 1 + let blockProcessingRewardByGenerator = blockProcessingReward / blocksProcessingBatchSize + let blockProcessingRewardByGeneratorRemainder = blockProcessingReward - blockProcessingRewardByGenerator * blocksProcessingBatchSize + + func map(acc: Int, inc: Int) = { + if (inc >= blocksProcessingBatchSize) then { + acc + } else { + let targetBlockHeight = nextBlockToProcess + inc + let targetBlockInfo = blockInfoByHeight(targetBlockHeight).valueOrErrorMessage(wrapErr("invalid block info")) + let treasuryRewardOrFail = rewardForOption(targetBlockInfo.rewards, treasuryAddressOrFail) + .valueOrErrorMessage(wrapErr("invalid treasury reward for height " + targetBlockHeight.toString())) + let generator = targetBlockInfo.generator + let available = factoryAddressOrFail.getInteger(keyAvailable(generator)).valueOrElse(0) + let lpAssetAmount = if (currentPriceOrFail > 0) + then fraction(treasuryRewardOrFail - blockProcessingRewardByGenerator, SCALE8, currentPriceOrFail) + else 0 + + strict factoryActionsSingle = [ + factoryAddressOrFail.invoke("integerEntry", [ + keyBlockProcessed(targetBlockHeight), + lpAssetAmount + ], []), + factoryAddressOrFail.invoke("integerEntry", [ + keyAvailable(generator), + available + lpAssetAmount + ], []) + ] + let callerReward = if (inc == blocksProcessingBatchSize - 1) then { + blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder + } else { + blockProcessingRewardByGenerator + } + + acc + callerReward + } + } + + strict callerReward = FOLD<5>([0, 1, 2, 3, 4], 0, map) + + strict actions = [ + factoryAddressOrFail.invoke("transferWaves", [ + userAddressBytes, callerReward ], []), factoryAddressOrFail.invoke("integerEntry", [ - keyAvailable(generator), - available + lpAssetAmount - ], []), - factoryAddressOrFail.invoke("transferWaves", [ - userAddressBytes, blockProcessingRewardOrFail + keyNextBlockToProcess(), + nextBlockToProcess + blocksProcessingBatchSize ], []) ] - (nil, factoryActions) + + (nil, unit) } @Verifier(tx) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 1bf838d..47fd323 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -20,7 +20,6 @@ func keyChildAddress() = "%s__child" # 3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h func keyBlockProcessingReward() = "%s__blockProcessingReward" # feature 19 activation height should be set initially func keyNextBlockToProcess() = "%s__nextBlockToProcess" -func keyBlocksProcessingBatchSize() = "%s__blocksProcessingBatchSize" func keyLpAssetId() = "%s__lpAssetId" From c3709e6e71cf44099c13d0e75a12d957684df56b Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 9 Jun 2023 20:10:54 +0500 Subject: [PATCH 045/143] batch block processing fix --- contracts/calculator/calculator.ride | 31 ++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 1461239..0df3fcf 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -287,7 +287,7 @@ func processBlocks(userAddressBytes: ByteVector) = { .valueOrErrorMessage(wrapErr("invalid next block to process")) let periodEndHeight = currentStartHeight + periodLength - 1 - let blocksProcessingBatchSizeMax = 5 + let blocksProcessingBatchSizeMax = 40 # do not process blocks not in current period let blocksProcessingBatchSize = if ( @@ -319,28 +319,41 @@ func processBlocks(userAddressBytes: ByteVector) = { let lpAssetAmount = if (currentPriceOrFail > 0) then fraction(treasuryRewardOrFail - blockProcessingRewardByGenerator, SCALE8, currentPriceOrFail) else 0 + + let callerReward = if (inc == blocksProcessingBatchSize - 1) then { + blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder + } else { + blockProcessingRewardByGenerator + } strict factoryActionsSingle = [ - factoryAddressOrFail.invoke("integerEntry", [ + factoryAddressOrFail.invoke("stringEntry", [ keyBlockProcessed(targetBlockHeight), - lpAssetAmount + makeString([ + i.transactionId.toBase58String(), + userAddressBytes.toBase58String(), + treasuryRewardOrFail.toString(), + callerReward.toString(), + lpAssetAmount.toString() + ], SEP) ], []), factoryAddressOrFail.invoke("integerEntry", [ keyAvailable(generator), available + lpAssetAmount ], []) ] - let callerReward = if (inc == blocksProcessingBatchSize - 1) then { - blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder - } else { - blockProcessingRewardByGenerator - } acc + callerReward } } - strict callerReward = FOLD<5>([0, 1, 2, 3, 4], 0, map) + let list = [ + 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 + ] + strict callerReward = FOLD<40>(list, 0, map) strict actions = [ factoryAddressOrFail.invoke("transferWaves", [ From 433b3e35eccc38352d7869eeb0dcbdc2b07e3a37 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Tue, 13 Jun 2023 12:00:33 +0500 Subject: [PATCH 046/143] txs --- migrations/initial_investors.json | 3 ++- migrations/issue.json | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 migrations/issue.json diff --git a/migrations/initial_investors.json b/migrations/initial_investors.json index dba292b..15454b4 100644 --- a/migrations/initial_investors.json +++ b/migrations/initial_investors.json @@ -200,5 +200,6 @@ "proofs": [], "fee": 300000, "type": 12, - "version": 2 + "version": 2, + "chainId": 87 } \ No newline at end of file diff --git a/migrations/issue.json b/migrations/issue.json new file mode 100644 index 0000000..8d75b15 --- /dev/null +++ b/migrations/issue.json @@ -0,0 +1,12 @@ +{ + "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", + "quantity": 122581754945, + "fee": 100000000, + "name": "", + "description": "", + "type": 3, + "version": 2, + "reissuable": true, + "chainId": 87, + "proofs": [] +} \ No newline at end of file From 14c3a8b8398ce2503a13a282470c958adeb2952f Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Tue, 13 Jun 2023 12:05:36 +0500 Subject: [PATCH 047/143] reissue in block processing --- contracts/calculator/calculator.ride | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 0df3fcf..2eafc45 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -93,7 +93,6 @@ func rewardForOption(rewards: List[(Address, Int)], target: Address) = { else unit } -# TODO: reissue lp tokens? @Callable(i) func claimLP(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() @@ -316,15 +315,16 @@ func processBlocks(userAddressBytes: ByteVector) = { .valueOrErrorMessage(wrapErr("invalid treasury reward for height " + targetBlockHeight.toString())) let generator = targetBlockInfo.generator let available = factoryAddressOrFail.getInteger(keyAvailable(generator)).valueOrElse(0) - let lpAssetAmount = if (currentPriceOrFail > 0) - then fraction(treasuryRewardOrFail - blockProcessingRewardByGenerator, SCALE8, currentPriceOrFail) - else 0 let callerReward = if (inc == blocksProcessingBatchSize - 1) then { blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder } else { blockProcessingRewardByGenerator } + + let lpAssetAmount = if (currentPriceOrFail > 0) + then fraction(treasuryRewardOrFail - callerReward, SCALE8, currentPriceOrFail) + else 0 strict factoryActionsSingle = [ factoryAddressOrFail.invoke("stringEntry", [ @@ -343,7 +343,7 @@ func processBlocks(userAddressBytes: ByteVector) = { ], []) ] - acc + callerReward + acc + lpAssetAmount } } @@ -353,11 +353,14 @@ func processBlocks(userAddressBytes: ByteVector) = { 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 ] - strict callerReward = FOLD<40>(list, 0, map) + strict lpAssetAmountTotal = FOLD<40>(list, 0, map) strict actions = [ factoryAddressOrFail.invoke("transferWaves", [ - userAddressBytes, callerReward + userAddressBytes, blockProcessingReward + ], []), + factoryAddressOrFail.invoke("reissue", [ + lpAssetAmountTotal ], []), factoryAddressOrFail.invoke("integerEntry", [ keyNextBlockToProcess(), From 687620c6e5b1146b1d2dc1935c4fbc82be2946f2 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Tue, 13 Jun 2023 12:22:25 +0500 Subject: [PATCH 048/143] increase invested amount --- contracts/calculator/calculator.ride | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 2eafc45..30a4197 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -7,6 +7,7 @@ let CONTRACT_NAME = "calculator.ride" let SCALE8 = 100_000_000 let PENDING = "PENDING" let FINISHED = "FINISHED" +let WAVES = "WAVES" func wrapErr(s: String) = { CONTRACT_NAME + ": " + s @@ -16,9 +17,17 @@ func throwErr(s: String) = { throw(wrapErr(s)) } +func assetIdToString(assetId: ByteVector|Unit) = { + match assetId { + case b: ByteVector => b.toBase58String() + case _: Unit => WAVES + } +} + func keyFactoryAddress() = ["%s", "factory"].makeString(SEP) func keyLpAssetId() = ["%s", "lpAssetId"].makeString(SEP) func keyTreasuryAddress() = ["%s", "treasury"].makeString(SEP) +func keyInvested(assetId: ByteVector|Unit) = ["%s%s", "invested", assetIdToString(assetId)].makeString(SEP) func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toString()].makeString(SEP) func keyClaimed(userAddress: Address) = ["%s%s", "claimed", userAddress.toString()].makeString(SEP) func keyCurrentPeriod() = ["%s", "currentPeriod"].makeString(SEP) @@ -173,10 +182,13 @@ func invest(userAddressBytes: ByteVector) = { payment.amount } else throwErr("invalid payment amount") let lpAssetAmount = if (currentPriceOrFail > 0) then fraction(paymentAmount, SCALE8, currentPriceOrFail) else 0 + let invested = factoryAddressOrFail.getInteger(keyInvested(unit)).valueOrElse(0) let factoryActions = [ - # TODO: increase invested amount - factoryAddressOrFail.invoke("integerEntry", ["invested__WAVES", 0], []), + # increase invested amount + factoryAddressOrFail.invoke("integerEntry", [ + keyInvested(unit), invested + paymentAmount + ], []), factoryAddressOrFail.invoke("reissue", [lpAssetAmount], []), factoryAddressOrFail.invoke("transferAsset", [ userAddressBytes, lpAssetAmount, lpAssetIdOrFail From f41fce2d878dc83a06638a615606fa61ec99b1ba Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Tue, 13 Jun 2023 12:29:31 +0500 Subject: [PATCH 049/143] increase total withdrawal amount in withdraw --- contracts/calculator/calculator.ride | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 30a4197..61a7878 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -37,6 +37,7 @@ func keyPeriodLength() = "%s__periodLength" func keyBlockProcessingReward() = "%s__blockProcessingReward" func keyNextBlockToProcess() = "%s__nextBlockToProcess" func keyBlockProcessed(height: Int) = ["%s%d", "blockProcessed", height.toString()].makeString(SEP) +func keyWithdrawal() = "%s__withdrawal" func keyWithdrawalRequest(userAddress: Address, txId: ByteVector) = ["%s%s%s", "withdrawal", userAddress.toString(), txId.toBase58String()].makeString(SEP) func valueWithdrawalRequest(status: String, lpAssetAmount: Int, targetPeriod: Int, claimTxId: ByteVector|Unit) = { @@ -201,6 +202,7 @@ func invest(userAddressBytes: ByteVector) = { (nil, factoryActions) } +# payment in lp asset @Callable(i) func withdraw(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() @@ -210,9 +212,14 @@ func withdraw(userAddressBytes: ByteVector) = { let payment = if (i.payments.size() == 1) then i.payments[0] else throwErr(wrapErr("invalid payments")) let paymentAssetId = if (payment.assetId == lpAssetIdOrFail) then lpAssetIdOrFail else throwErr("invalid payment asset") let paymentAmount = if (payment.amount > 0) then payment.amount else throwErr("invalid payment amount") + let withdrawal = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) - # TODO: increase total withdrawal amount + # increase total withdrawal amount strict factoryActions = [ + factoryAddressOrFail.invoke("integerEntry", [ + keyWithdrawal(), + withdrawal + paymentAmount + ], []), factoryAddressOrFail.invoke("stringEntry", [ keyWithdrawalRequest(userAddress, i.transactionId), valueWithdrawalRequest(PENDING, paymentAmount, currentPeriodOrFail + 1, unit) @@ -224,6 +231,7 @@ func withdraw(userAddressBytes: ByteVector) = { ], factoryActions) } +# TODO: decrease total withdrawal amount @Callable(i) func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { strict checkCaller = i.onlyFactory() From b53708c70eeb6b15af502b0b38fdac2e035cf7d0 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Tue, 13 Jun 2023 12:48:46 +0500 Subject: [PATCH 050/143] decrease total withdrawal amount --- contracts/calculator/calculator.ride | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 61a7878..cd43283 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -231,7 +231,6 @@ func withdraw(userAddressBytes: ByteVector) = { ], factoryActions) } -# TODO: decrease total withdrawal amount @Callable(i) func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { strict checkCaller = i.onlyFactory() @@ -241,7 +240,16 @@ func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { .valueOrErrorMessage(wrapErr("invalid withdrawal request")) let (status, lpAssetAmount, targetPeriod, claimTxId) = parseWithdrawalRequestValueOrFail(withdrawalRequestOption) if (status == PENDING) then { + let withdrawal = factoryAddressOrFail.getInteger(keyWithdrawal()) + .valueOrErrorMessage(wrapErr("invalid total withdrawal amount")) strict factoryActions = [ + # decrease total withdrawal amount + factoryAddressOrFail.invoke("integerEntry", [ + keyWithdrawal(), + if (withdrawal >= lpAssetAmount) + then withdrawal - lpAssetAmount + else throwErr("invalid withdrawal amount") + ], []), factoryAddressOrFail.invoke("deleteEntry", [ keyWithdrawalRequest(userAddress, txId) ], []), From 319ff3f439d7d29e8f5765d985e7ebd1aa56e358 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Tue, 13 Jun 2023 13:29:03 +0500 Subject: [PATCH 051/143] calculator list format --- contracts/calculator/calculator.ride | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index cd43283..94bb6fc 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -376,7 +376,7 @@ func processBlocks(userAddressBytes: ByteVector) = { } let list = [ - 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 From 611e68645bad6c0cde862512c9a900181df6f264 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Tue, 13 Jun 2023 18:55:45 +0500 Subject: [PATCH 052/143] package.json test fix --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index edce70c..4c93326 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "1.0.0", "description": "", "scripts": { - "test": "NETWORK=custom mocha -r dotenv/config" + "test": "NETWORK=custom mocha" }, "keywords": [], "author": "", From 6a3ac03b6b2f73170da59b81cad6696ee6dd5d91 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 14 Jun 2023 17:43:11 +0500 Subject: [PATCH 053/143] dao address for custom network --- Dockerfile | 3 ++ docker-compose.yml | 12 +++++ env.js | 3 +- waves.custom.conf | 114 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 waves.custom.conf diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..48bdb93 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,3 @@ +ARG NODE_TAG=latest +FROM wavesplatform/wavesnode:$NODE_TAG +COPY waves.custom.conf /etc/waves/waves.conf diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..929b38f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,12 @@ +services: + waves-private-node: + build: . + ports: + - '6869:6869' + waves-explorer: + image: wavesplatform/explorer + ports: + - '3000:8080' + environment: + API_NODE_URL: http://localhost:6869 + NODE_LIST: http://localhost:6869 diff --git a/env.js b/env.js index ab36d72..9f8f8bf 100644 --- a/env.js +++ b/env.js @@ -6,7 +6,8 @@ const envs = { custom: { chainId: 'R', apiBase: 'http://localhost:6869', - baseSeed: 'waves private node seed with waves tokens' + baseSeed: 'waves private node seed with waves tokens', + daoSeed: 'waves private node seed dao address' } } diff --git a/waves.custom.conf b/waves.custom.conf new file mode 100644 index 0000000..9bc3bcc --- /dev/null +++ b/waves.custom.conf @@ -0,0 +1,114 @@ +waves { + directory = /var/lib/waves + + blockchain { + type: CUSTOM + custom { + address-scheme-character: "R" + functionality { + feature-check-blocks-period = 5 + blocks-for-feature-activation = 5 + allow-temporary-negative-until: 0 + allow-invalid-payment-transactions-by-timestamp: 0 + require-sorted-transactions-after: 0 + generation-balance-depth-from-50-to-1000-after-height: 0 + minimal-generating-balance-after: 0 + allow-transactions-from-future-until: 0 + allow-unissued-assets-until: 0 + require-payment-unique-id-after: 0 + allow-invalid-reissue-in-same-block-until-timestamp: 0 + allow-multiple-lease-cancel-transaction-until-timestamp: 0 + reset-effective-balances-at-height: 1 + allow-leased-balance-transfer-until: 0 + block-version-3-after-height: 0 + pre-activated-features = { + 1 = 0 + 2 = 0 + 3 = 0 + 4 = 0 + 5 = 0 + 6 = 0 + 7 = -${waves.blockchain.custom.functionality.feature-check-blocks-period} + 8 = 0 + 9 = 0 + 10 = 0 + 11 = 0 + 12 = 0 + 13 = 0 + 14 = 1 + 15 = 0 + 16 = 0 + 17 = 0 + 18 = 0 + 19 = 0 + 20 = 0 + } + double-features-periods-after-height = 1000000000 + max-transaction-time-back-offset = 120m + max-transaction-time-forward-offset = 90m + min-asset-info-update-interval = 2 + min-block-time = 5s + dao-address = "3M7aPRGkd46VUb6HePbjeH3FJoYBRhjk8aq" + } + genesis { + average-block-delay: 10000ms + initial-base-target: 1240 + timestamp: 1566817216027 + block-timestamp: 1566817216027 + signature: "4WNhR15xizRv3uYwaXgtMzuvQ8ukKKimoDSp19ms3W3UU9XHgFo8q5jgcnWYKkJ7qtam9g5i5kLr6g38iJe8Fdgh" + initial-balance: 10000000000000000 + transactions = [ + {recipient: "3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF", amount: 10000000000000000} + ] + } + rewards { + term = 6 + term-after-capped-reward-feature = 3 + initial = 600000000 + min-increment = 50000000 + voting-interval = 3 + } + } + } + + rewards.desired = 575000000 + + network { + bind-address = "0.0.0.0" + port = 6860 + known-peers = [] + node-name = "Private node" + declared-address = "127.0.0.1:6860" + + traffic-logger { + ignore-tx-messages = [1, 2, 20, 21, 22, 24, 26, 27, 28] + ignore-rx-messages = ${waves.network.traffic-logger.ignore-tx-messages} + } + } + + wallet { + seed = "TBXHUUcVx2n3Rgszpu5MCybRaR86JGmqCWp7XKh7czU57ox5dgjdX4K4" + password = "rich" + } + + rest-api { + enable = yes + bind-address = "0.0.0.0" + port = 6869 + api-key-hash = "BNejVjPAWUrXJTqNrTboGPENAJt9PXnmfdtBgMSgs1u3" + minimum-peers = 0 + } + + miner { + interval-after-last-block-then-generation-is-allowed = 999d + max-transactions-in-micro-block = 500 + micro-block-interval = 1500ms + min-micro-block-age = 0s + quorum = 0 + } +} + +kamon.enable = no +metrics.enable = no + +include "local.conf" From ea43b17028d6470f6f191dbf8b5208ddd443b229 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 14 Jun 2023 19:57:56 +0500 Subject: [PATCH 054/143] process blocks and claim --- contracts/calculator/calculator.ride | 2 +- contracts/calculator/mock/factory.mock.ride | 6 -- contracts/calculator/test/_setup.js | 51 ++++++++++++-- .../calculator/test/factory_address.spec.js | 4 +- .../calculator/test/process_blocks.spec.js | 69 +++++++++++++++++++ utils/api.js | 5 +- waves.custom.conf | 2 +- 7 files changed, 121 insertions(+), 18 deletions(-) delete mode 100644 contracts/calculator/mock/factory.mock.ride create mode 100644 contracts/calculator/test/process_blocks.spec.js diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 94bb6fc..2dd167d 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -117,7 +117,7 @@ func claimLP(userAddressBytes: ByteVector) = { keyAvailable(userAddress), 0 ], []), - factoryAddressOrFail.invoke("stringEntry", [ + factoryAddressOrFail.invoke("integerEntry", [ keyClaimed(userAddress), claimed + available ], []) diff --git a/contracts/calculator/mock/factory.mock.ride b/contracts/calculator/mock/factory.mock.ride deleted file mode 100644 index 74e4a95..0000000 --- a/contracts/calculator/mock/factory.mock.ride +++ /dev/null @@ -1,6 +0,0 @@ -{-# STDLIB_VERSION 6 #-} -{-# CONTENT_TYPE DAPP #-} -{-# SCRIPT_TYPE ACCOUNT #-} - -@Callable(i) -func stringEntry(key: String, val: String) = (nil, unit) \ No newline at end of file diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index 37258d1..213e4b0 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -1,22 +1,22 @@ import wc from '@waves/ts-lib-crypto' import { + burn, data, + issue, massTransfer } from '@waves/waves-transactions' import { format } from 'path' import { table, getBorderCharacters } from 'table' import { - chainId, broadcastAndWait, baseSeed, setScriptFromFile + chainId, broadcastAndWait, baseSeed, setScriptFromFile, daoAddress } from '../../../utils/api.js' const nonceLength = 3 -const ridePath = 'contracts/calculator' -const mockPath = 'contracts/calculator/mock' -const calculatorPath = format({ dir: ridePath, base: 'calculator.ride' }) -const factoryMockPath = format({ dir: mockPath, base: 'factory.mock.ride' }) +const calculatorPath = format({ dir: 'contracts/calculator', base: 'calculator.ride' }) +const factoryMockPath = format({ dir: 'contracts/factory', base: 'factory.ride' }) -export const setupAccounts = async () => { +export const setup = async () => { const nonce = wc.random(nonceLength, 'Buffer').toString('hex') const names = [ 'factory', @@ -35,6 +35,21 @@ export const setupAccounts = async () => { }, baseSeed) await broadcastAndWait(massTransferTx) + const { id: lpAssetId } = await broadcastAndWait(issue({ + name: 'WAVESDAOLP', + description: '', + quantity: 1, + decimals: 8, + reissuable: true, + chainId + }, accounts.factory.seed)) + + await broadcastAndWait(burn({ + assetId: lpAssetId, + amount: 1, + chainId + }, accounts.factory.seed)) + await broadcastAndWait(data({ additionalFee: 4e5, data: [ @@ -47,6 +62,28 @@ export const setupAccounts = async () => { chainId }, accounts.calculator.seed)) + await broadcastAndWait(data({ + additionalFee: 4e5, + data: [ + { + key: '%s__calculator', + type: 'string', + value: accounts.calculator.address + }, + { + key: '%s__treasury', + type: 'string', + value: daoAddress + }, + { + key: '%s__lpAssetId', + type: 'string', + value: lpAssetId + } + ], + chainId + }, accounts.factory.seed)) + await setScriptFromFile(calculatorPath, accounts.calculator.seed) await setScriptFromFile(factoryMockPath, accounts.factory.seed) @@ -58,5 +95,5 @@ export const setupAccounts = async () => { header: { content: `pid: ${process.pid}, nonce: ${nonce}` } })) - return accounts + return { accounts, lpAssetId } } diff --git a/contracts/calculator/test/factory_address.spec.js b/contracts/calculator/test/factory_address.spec.js index 133a8b8..44b85f0 100644 --- a/contracts/calculator/test/factory_address.spec.js +++ b/contracts/calculator/test/factory_address.spec.js @@ -1,7 +1,7 @@ import chai from 'chai' import chaiAsPromised from 'chai-as-promised' import { api } from '../../../utils/api.js' -import { setupAccounts } from './_setup.js' +import { setup } from './_setup.js' chai.use(chaiAsPromised) const { expect } = chai @@ -10,7 +10,7 @@ describe(`[${process.pid}] calculator: factory address`, () => { let accounts before(async () => { - accounts = await setupAccounts() + ({ accounts } = await setup()) }) it('factory address should be known', async () => { diff --git a/contracts/calculator/test/process_blocks.spec.js b/contracts/calculator/test/process_blocks.spec.js new file mode 100644 index 0000000..4278407 --- /dev/null +++ b/contracts/calculator/test/process_blocks.spec.js @@ -0,0 +1,69 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { api, daoAddress, chainId, broadcastAndWait, baseSeed } from '../../../utils/api.js' +import { setup } from './_setup.js' +import { data, invokeScript } from '@waves/waves-transactions' +import { address } from '@waves/ts-lib-crypto' + +chai.use(chaiAsPromised) +const { expect } = chai + +describe(`[${process.pid}] calculator: process blocks`, () => { + let accounts, lpAssetId + const periodLength = 2 + const blockProcessingReward = 500000 + + before(async () => { + ({ accounts, lpAssetId } = await setup()) + + const nextBlockToProcess = 2 + const currentPeriod = 0 + const price = 100000000 + await broadcastAndWait(data({ + data: [ + { key: '%s__nextBlockToProcess', type: 'integer', value: nextBlockToProcess }, + { key: '%s__currentPeriod', type: 'integer', value: currentPeriod }, + { key: '%s%d__startHeight__0', type: 'integer', value: nextBlockToProcess }, + { key: '%s%d__price__0', type: 'integer', value: price }, + { key: '%s__periodLength', type: 'integer', value: periodLength }, + { key: '%s__blockProcessingReward', type: 'integer', value: blockProcessingReward } + ], + chainId, + additionalFee: 4e5 + }, accounts.factory.seed)) + }) + + it('rewardForOption function should parse dao reward', async () => { + const targetHeight = 2 + const response = await api.utils.fetchEvaluate( + accounts.calculator.address, + `rewardForOption(blockInfoByHeight(${targetHeight}).value().rewards, Address(base58'${daoAddress}'))` + ) + const expectedReward = 200000000 + expect(response).to.not.have.property('error') + expect(response.result.value).to.equal(expectedReward) + }) + + it('processBlock call', async () => { + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { + function: 'processBlocks', + args: [] + }, + chainId + }, accounts.user1.seed)) + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { + function: 'claimLP', + args: [] + }, + chainId + }, baseSeed)) + const { balance } = await api.assets.fetchBalanceAddressAssetId(address(baseSeed, chainId), lpAssetId) + const daoBlockReward = 2e8 + const expectedBalance = daoBlockReward * periodLength - blockProcessingReward + expect(balance).to.equal(expectedBalance) + }) +}) diff --git a/utils/api.js b/utils/api.js index 2a537e9..8ab2990 100644 --- a/utils/api.js +++ b/utils/api.js @@ -3,8 +3,11 @@ import { nodeInteraction, setScript } from '@waves/waves-transactions' import { readFile } from 'fs/promises' import { env } from '../env.js' +import { address } from '@waves/ts-lib-crypto' -export const { apiBase, chainId, baseSeed } = env(process.env.NETWORK) +export const { apiBase, chainId, baseSeed, daoSeed } = env(process.env.NETWORK) + +export const daoAddress = address(daoSeed, chainId) export const api = create(apiBase) export const largeNumbeConvertHeader = { headers: { Accept: 'application/json;large-significand-format=string' } } diff --git a/waves.custom.conf b/waves.custom.conf index 9bc3bcc..3ccdf46 100644 --- a/waves.custom.conf +++ b/waves.custom.conf @@ -71,7 +71,7 @@ waves { } } - rewards.desired = 575000000 + rewards.desired = 600000000 network { bind-address = "0.0.0.0" From 9b8280f6d6293a6356913798e771d2b9a671b58e Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 15 Jun 2023 19:56:13 +0500 Subject: [PATCH 055/143] tests + refactor invest, withdraw, cancel withdraw test + block processing test refactor --- contracts/calculator/test/_setup.js | 56 +++++++++---------- .../calculator/test/cancel_withdraw.spec.js | 44 +++++++++++++++ contracts/calculator/test/invest.spec.js | 30 ++++++++++ .../calculator/test/process_blocks.spec.js | 36 ++---------- contracts/calculator/test/withdraw.spec.js | 36 ++++++++++++ 5 files changed, 142 insertions(+), 60 deletions(-) create mode 100644 contracts/calculator/test/cancel_withdraw.spec.js create mode 100644 contracts/calculator/test/invest.spec.js create mode 100644 contracts/calculator/test/withdraw.spec.js diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index 213e4b0..55828e9 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -16,7 +16,14 @@ const nonceLength = 3 const calculatorPath = format({ dir: 'contracts/calculator', base: 'calculator.ride' }) const factoryMockPath = format({ dir: 'contracts/factory', base: 'factory.ride' }) -export const setup = async () => { +export const setup = async ({ + periodLength = 2, + blockProcessingReward = 500000, + nextBlockToProcess = 2, + currentPeriod = 0, + price = 100000000, + period = 0 +} = {}) => { const nonce = wc.random(nonceLength, 'Buffer').toString('hex') const names = [ 'factory', @@ -28,6 +35,13 @@ export const setup = async () => { const seed = `${item}#${nonce}` return [item, { seed, address: wc.address(seed, chainId), publicKey: wc.publicKey(seed) }] })) + const accountsInfo = Object.entries(accounts) + .map(([name, { address }]) => [name, address]) + console.log(table(accountsInfo, { + border: getBorderCharacters('norc'), + drawHorizontalLine: (index, size) => index === 0 || index === 1 || index === size, + header: { content: `pid: ${process.pid}, nonce: ${nonce}` } + })) const amount = 100e8 const massTransferTx = massTransfer({ transfers: Object.values(accounts).map(({ address }) => ({ recipient: address, amount })), @@ -53,11 +67,7 @@ export const setup = async () => { await broadcastAndWait(data({ additionalFee: 4e5, data: [ - { - key: '%s__factory', - type: 'string', - value: accounts.factory.address - } + { key: '%s__factory', type: 'string', value: accounts.factory.address } ], chainId }, accounts.calculator.seed)) @@ -65,21 +75,15 @@ export const setup = async () => { await broadcastAndWait(data({ additionalFee: 4e5, data: [ - { - key: '%s__calculator', - type: 'string', - value: accounts.calculator.address - }, - { - key: '%s__treasury', - type: 'string', - value: daoAddress - }, - { - key: '%s__lpAssetId', - type: 'string', - value: lpAssetId - } + { key: '%s__calculator', type: 'string', value: accounts.calculator.address }, + { key: '%s__treasury', type: 'string', value: daoAddress }, + { key: '%s__lpAssetId', type: 'string', value: lpAssetId }, + { key: '%s__nextBlockToProcess', type: 'integer', value: nextBlockToProcess }, + { key: '%s__currentPeriod', type: 'integer', value: currentPeriod }, + { key: `%s%d__startHeight__${period}`, type: 'integer', value: nextBlockToProcess }, + { key: `%s%d__price__${period}`, type: 'integer', value: price }, + { key: '%s__periodLength', type: 'integer', value: periodLength }, + { key: '%s__blockProcessingReward', type: 'integer', value: blockProcessingReward } ], chainId }, accounts.factory.seed)) @@ -87,13 +91,5 @@ export const setup = async () => { await setScriptFromFile(calculatorPath, accounts.calculator.seed) await setScriptFromFile(factoryMockPath, accounts.factory.seed) - const accountsInfo = Object.entries(accounts) - .map(([name, { seed, address }]) => [name, address]) - console.log(table(accountsInfo, { - border: getBorderCharacters('norc'), - drawHorizontalLine: (index, size) => index === 0 || index === 1 || index === size, - header: { content: `pid: ${process.pid}, nonce: ${nonce}` } - })) - - return { accounts, lpAssetId } + return { accounts, lpAssetId, periodLength, blockProcessingReward, price } } diff --git a/contracts/calculator/test/cancel_withdraw.spec.js b/contracts/calculator/test/cancel_withdraw.spec.js new file mode 100644 index 0000000..bad901c --- /dev/null +++ b/contracts/calculator/test/cancel_withdraw.spec.js @@ -0,0 +1,44 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { api, chainId, broadcastAndWait } from '../../../utils/api.js' +import { setup } from './_setup.js' +import { invokeScript } from '@waves/waves-transactions' + +chai.use(chaiAsPromised) +const { expect } = chai + +describe(`[${process.pid}] calculator: cancel withdraw`, () => { + let accounts, lpAssetId, withdrawTxId + + before(async () => { + ({ accounts, lpAssetId } = await setup()) + + const paymentAmount = 1e8 + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'invest', args: [] }, + payment: [{ assetId: null, amount: paymentAmount }], + chainId + }, accounts.user1.seed)); + + ({ id: withdrawTxId } = await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'withdraw', args: [] }, + payment: [{ assetId: lpAssetId, amount: paymentAmount }], + chainId + }, accounts.user1.seed))) + }) + + it('total withdrawal amount should be decreased', async () => { + const paymentAmount = 1e8 + const { value: totalWithdrawalAmountBefore } = await api.addresses.fetchDataKey(accounts.factory.address, '%s__withdrawal') + expect(totalWithdrawalAmountBefore).to.equal(paymentAmount) + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'cancelWithdraw', args: [{ type: 'string', value: withdrawTxId }] }, + chainId + }, accounts.user1.seed)) + const { value: totalWithdrawalAmountAfter } = await api.addresses.fetchDataKey(accounts.factory.address, '%s__withdrawal') + expect(totalWithdrawalAmountAfter).to.equal(0) + }) +}) diff --git a/contracts/calculator/test/invest.spec.js b/contracts/calculator/test/invest.spec.js new file mode 100644 index 0000000..020a174 --- /dev/null +++ b/contracts/calculator/test/invest.spec.js @@ -0,0 +1,30 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { api, chainId, broadcastAndWait } from '../../../utils/api.js' +import { setup } from './_setup.js' +import { invokeScript } from '@waves/waves-transactions' + +chai.use(chaiAsPromised) +const { expect } = chai + +describe(`[${process.pid}] calculator: invest`, () => { + let accounts, lpAssetId, price + + before(async () => { + ({ accounts, lpAssetId, price } = await setup()) + }) + + it('user should receive lp tokens', async () => { + const priceScale = 1e8 + const paymentAmount = 1e8 + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'invest', args: [] }, + payment: [{ assetId: null, amount: paymentAmount }], + chainId + }, accounts.user1.seed)) + const { balance } = await api.assets.fetchBalanceAddressAssetId(accounts.user1.address, lpAssetId) + const expectedBalance = paymentAmount * priceScale / price + expect(balance).to.equal(expectedBalance) + }) +}) diff --git a/contracts/calculator/test/process_blocks.spec.js b/contracts/calculator/test/process_blocks.spec.js index 4278407..ecd2250 100644 --- a/contracts/calculator/test/process_blocks.spec.js +++ b/contracts/calculator/test/process_blocks.spec.js @@ -2,35 +2,17 @@ import chai from 'chai' import chaiAsPromised from 'chai-as-promised' import { api, daoAddress, chainId, broadcastAndWait, baseSeed } from '../../../utils/api.js' import { setup } from './_setup.js' -import { data, invokeScript } from '@waves/waves-transactions' +import { invokeScript } from '@waves/waves-transactions' import { address } from '@waves/ts-lib-crypto' chai.use(chaiAsPromised) const { expect } = chai describe(`[${process.pid}] calculator: process blocks`, () => { - let accounts, lpAssetId - const periodLength = 2 - const blockProcessingReward = 500000 + let accounts, lpAssetId, periodLength, blockProcessingReward before(async () => { - ({ accounts, lpAssetId } = await setup()) - - const nextBlockToProcess = 2 - const currentPeriod = 0 - const price = 100000000 - await broadcastAndWait(data({ - data: [ - { key: '%s__nextBlockToProcess', type: 'integer', value: nextBlockToProcess }, - { key: '%s__currentPeriod', type: 'integer', value: currentPeriod }, - { key: '%s%d__startHeight__0', type: 'integer', value: nextBlockToProcess }, - { key: '%s%d__price__0', type: 'integer', value: price }, - { key: '%s__periodLength', type: 'integer', value: periodLength }, - { key: '%s__blockProcessingReward', type: 'integer', value: blockProcessingReward } - ], - chainId, - additionalFee: 4e5 - }, accounts.factory.seed)) + ({ accounts, lpAssetId, periodLength, blockProcessingReward } = await setup()) }) it('rewardForOption function should parse dao reward', async () => { @@ -44,21 +26,15 @@ describe(`[${process.pid}] calculator: process blocks`, () => { expect(response.result.value).to.equal(expectedReward) }) - it('processBlock call', async () => { + it('generator should be able to claim lp tokens', async () => { await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, - call: { - function: 'processBlocks', - args: [] - }, + call: { function: 'processBlocks', args: [] }, chainId }, accounts.user1.seed)) await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, - call: { - function: 'claimLP', - args: [] - }, + call: { function: 'claimLP', args: [] }, chainId }, baseSeed)) const { balance } = await api.assets.fetchBalanceAddressAssetId(address(baseSeed, chainId), lpAssetId) diff --git a/contracts/calculator/test/withdraw.spec.js b/contracts/calculator/test/withdraw.spec.js new file mode 100644 index 0000000..891af4d --- /dev/null +++ b/contracts/calculator/test/withdraw.spec.js @@ -0,0 +1,36 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { api, chainId, broadcastAndWait } from '../../../utils/api.js' +import { setup } from './_setup.js' +import { invokeScript } from '@waves/waves-transactions' + +chai.use(chaiAsPromised) +const { expect } = chai + +describe(`[${process.pid}] calculator: withdraw`, () => { + let accounts, lpAssetId + + before(async () => { + ({ accounts, lpAssetId } = await setup()) + + const paymentAmount = 1e8 + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'invest', args: [] }, + payment: [{ assetId: null, amount: paymentAmount }], + chainId + }, accounts.user1.seed)) + }) + + it('total withdrawal amount should be increased', async () => { + const paymentAmount = 1e8 + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'withdraw', args: [] }, + payment: [{ assetId: lpAssetId, amount: paymentAmount }], + chainId + }, accounts.user1.seed)) + const { value: totalWithdrawalAmount } = await api.addresses.fetchDataKey(accounts.factory.address, '%s__withdrawal') + expect(totalWithdrawalAmount).to.equal(paymentAmount) + }) +}) From e8f64f11ca406a33a6dec095d31a38c02f6a60d1 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 16 Jun 2023 12:39:37 +0500 Subject: [PATCH 056/143] do not finalize if there are unprocessed blocks --- contracts/calculator/calculator.ride | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 2dd167d..3a514bd 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -127,7 +127,6 @@ func claimLP(userAddressBytes: ByteVector) = { } # payment in waves to fulfill all withdrawal requests -# TODO: do not finalize if there are unprocessed blocks @Callable(i) func finalize( newTreasuryVolumeInWaves: Int, @@ -135,16 +134,34 @@ func finalize( pwrManagersBonus: Int, # 0..1×10⁸ treasuryVolumeDiffAllocationCoef: Int # -1..1×10⁸ ) = { + let currentPeriodOrFail = + factoryAddressOrFail.getInteger(keyCurrentPeriod()) + .valueOrErrorMessage(wrapErr("invalid period")) + let periodLength = + factoryAddressOrFail.getInteger(keyPeriodLength()) + .valueOrErrorMessage(wrapErr("invalid period length")) + let currentStartHeight = factoryAddressOrFail + .getInteger(keyStartHeight(currentPeriodOrFail)) + .valueOrErrorMessage(wrapErr("invalid start height")) + let currentPriceOrFail = + factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)) + .valueOrErrorMessage(wrapErr("invalid price")) + let nextBlockToProcess = factoryAddressOrFail + .getInteger(keyNextBlockToProcess()) + .valueOrErrorMessage(wrapErr("invalid next block to process")) + + let periodEndHeight = currentStartHeight + periodLength - 1 + strict checks = [ i.originCaller == factoryAddressOrFail || throwErr("permission denied"), + nextBlockToProcess > periodEndHeight || throwErr("unprocessed blocks"), newTreasuryVolumeInWaves >= 0 || throwErr("invalid new treasury volume"), xtnPrice >= 0 || throwErr("invalid XTN price"), pwrManagersBonus >= 0 && pwrManagersBonus <= SCALE8 || throwErr("invalid PWR managers bonus"), treasuryVolumeDiffAllocationCoef >= -SCALE8 && treasuryVolumeDiffAllocationCoef <= SCALE8 || throwErr("invalid treasury volume diff allocation coefficient") ] - let currentPeriodOrFail = - factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage(wrapErr("invalid period")) + let newPeriod = currentPeriodOrFail + 1 # TODO: calculate new price let newPrice = SCALE8 From 2f354bed53d7e37e027e2663d9a29f8556780b21 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 16 Jun 2023 13:20:48 +0500 Subject: [PATCH 057/143] burn total withdrawal amount --- contracts/calculator/calculator.ride | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 3a514bd..d86fd20 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -166,8 +166,8 @@ func finalize( # TODO: calculate new price let newPrice = SCALE8 - # TODO: burn total withdrawal amount - let lpAssetAmountToBurn = 0 + # burn total withdrawal amount + let lpAssetAmountToBurn = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) let factoryActions = [ # update period @@ -248,6 +248,7 @@ func withdraw(userAddressBytes: ByteVector) = { ], factoryActions) } +# TODO: target period should be greater than current period @Callable(i) func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { strict checkCaller = i.onlyFactory() From b72fa368acf0988742fe4e868e329352ce57807c Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 16 Jun 2023 13:23:56 +0500 Subject: [PATCH 058/143] cancelWithdraw checks update --- contracts/calculator/calculator.ride | 49 +++++++++++++++------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index d86fd20..d0d7c3b 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -248,7 +248,6 @@ func withdraw(userAddressBytes: ByteVector) = { ], factoryActions) } -# TODO: target period should be greater than current period @Callable(i) func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { strict checkCaller = i.onlyFactory() @@ -256,29 +255,33 @@ func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { let withdrawalRequestOption = factoryAddressOrFail .getString(keyWithdrawalRequest(userAddress, txId)) .valueOrErrorMessage(wrapErr("invalid withdrawal request")) + let currentPeriodOrFail = + factoryAddressOrFail.getInteger(keyCurrentPeriod()) + .valueOrErrorMessage(wrapErr("invalid period")) let (status, lpAssetAmount, targetPeriod, claimTxId) = parseWithdrawalRequestValueOrFail(withdrawalRequestOption) - if (status == PENDING) then { - let withdrawal = factoryAddressOrFail.getInteger(keyWithdrawal()) - .valueOrErrorMessage(wrapErr("invalid total withdrawal amount")) - strict factoryActions = [ - # decrease total withdrawal amount - factoryAddressOrFail.invoke("integerEntry", [ - keyWithdrawal(), - if (withdrawal >= lpAssetAmount) - then withdrawal - lpAssetAmount - else throwErr("invalid withdrawal amount") - ], []), - factoryAddressOrFail.invoke("deleteEntry", [ - keyWithdrawalRequest(userAddress, txId) - ], []), - factoryAddressOrFail.invoke("transferAsset", [ - userAddressBytes, lpAssetAmount, lpAssetIdOrFail - ], []) - ] - (nil, factoryActions) - } else { - throwErr("invalid withdrawal request status") - } + strict checks = [ + status == PENDING || throwErr("invalid withdrawal request status"), + targetPeriod > currentPeriodOrFail || throwErr("invalid withdrawal request period") + ] + + let withdrawal = factoryAddressOrFail.getInteger(keyWithdrawal()) + .valueOrErrorMessage(wrapErr("invalid total withdrawal amount")) + strict factoryActions = [ + # decrease total withdrawal amount + factoryAddressOrFail.invoke("integerEntry", [ + keyWithdrawal(), + if (withdrawal >= lpAssetAmount) + then withdrawal - lpAssetAmount + else throwErr("invalid withdrawal amount") + ], []), + factoryAddressOrFail.invoke("deleteEntry", [ + keyWithdrawalRequest(userAddress, txId) + ], []), + factoryAddressOrFail.invoke("transferAsset", [ + userAddressBytes, lpAssetAmount, lpAssetIdOrFail + ], []) + ] + (nil, factoryActions) } @Callable(i) From a2276921ca2dbb777c8206df449a43c5c62f8c51 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 16 Jun 2023 18:06:27 +0500 Subject: [PATCH 059/143] fix setScriptFromFile --- utils/api.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/utils/api.js b/utils/api.js index 8ab2990..dff53b5 100644 --- a/utils/api.js +++ b/utils/api.js @@ -36,7 +36,9 @@ export const setScriptFromFile = async ( account, transform = (content) => content ) => { - const { script, extraFee, error } = await api.utils.fetchCompileCode(await readFile(path, { encoding: 'utf-8' })) + const file = await readFile(path, { encoding: 'utf-8' }) + const fileTransformed = transform(file) + const { script, extraFee, error } = await api.utils.fetchCompileCode(fileTransformed) if (error) throw new Error(error.message) const ssTx = setScript({ script, From 298e9daf2d8e1675e817a07232e19f463bcba31e Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Tue, 20 Jun 2023 17:53:23 +0500 Subject: [PATCH 060/143] finalize draft --- contracts/calculator/calculator.ride | 79 +++++++++++++++++++++++----- contracts/factory/factory.md | 1 + 2 files changed, 67 insertions(+), 13 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index d0d7c3b..bcfe0f3 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -24,8 +24,13 @@ func assetIdToString(assetId: ByteVector|Unit) = { } } +func abs(n: Int) = { + if (n < 0) then -n else n +} + func keyFactoryAddress() = ["%s", "factory"].makeString(SEP) func keyLpAssetId() = ["%s", "lpAssetId"].makeString(SEP) +func keyXtnAssetId() = ["%s", "xtnAssetId"].makeString(SEP) func keyTreasuryAddress() = ["%s", "treasury"].makeString(SEP) func keyInvested(assetId: ByteVector|Unit) = ["%s%s", "invested", assetIdToString(assetId)].makeString(SEP) func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toString()].makeString(SEP) @@ -75,6 +80,15 @@ let lpAssetIdOption = match factoryAddressOption { } let lpAssetIdOrFail = lpAssetIdOption.valueOrErrorMessage(wrapErr("invalid lpAssetId")) +let xtnAssetIdOption = match factoryAddressOption { + case a: Address => match a.getString(keyXtnAssetId()) { + case s: String => s.fromBase58String() + case _: Unit => unit + } + case _: Unit => unit +} +let xtnAssetIdOrFail = xtnAssetIdOption.valueOrErrorMessage(wrapErr("invalid xtnAssetId")) + let treasuryAddressOption = match factoryAddressOption { case a: Address => match a.getString(keyTreasuryAddress()) { case s: String => s.addressFromString() @@ -127,6 +141,10 @@ func claimLP(userAddressBytes: ByteVector) = { } # payment in waves to fulfill all withdrawal requests +# treasuryVolumeDiffAllocationCoef: +# [-1, 0) - profit to donation +# 0 - in proportion +# (0, 1] - profit to investment @Callable(i) func finalize( newTreasuryVolumeInWaves: Int, @@ -162,25 +180,60 @@ func finalize( || throwErr("invalid treasury volume diff allocation coefficient") ] + let investedXtnAmount = factoryAddressOrFail.getInteger( + keyInvested(xtnAssetIdOrFail) + ).valueOrElse(0) + let investedWavesAmount = factoryAddressOrFail.getInteger( + keyInvested(unit) + ).valueOrElse(0) + + let investedXtnAmountInWaves = fraction(investedXtnAmount, xtnPrice, SCALE8) + let currentTreasuryVolumeInWaves = investedXtnAmountInWaves + investedWavesAmount + let profitRaw = newTreasuryVolumeInWaves - currentTreasuryVolumeInWaves + let pwrManagersBonusAmount = if (profitRaw > 0) + then fraction(profitRaw, pwrManagersBonus, SCALE8) + else 0 + let profit = profitRaw - pwrManagersBonusAmount + let donationPart = fraction(investedXtnAmountInWaves, SCALE8, currentTreasuryVolumeInWaves) + let donationProfitPartRaw = fraction(profit, donationPart, SCALE8) + let investmentProfitPartRaw = profit - donationProfitPartRaw + let treasuryVolumeDiffAllocationCoefAbs = abs(treasuryVolumeDiffAllocationCoef) + let amountToDonation = fraction( + investmentProfitPartRaw, + if (treasuryVolumeDiffAllocationCoef < 0) then treasuryVolumeDiffAllocationCoefAbs else 0, + SCALE8 + ) + let amountToInvestment = fraction( + donationProfitPartRaw, + if (treasuryVolumeDiffAllocationCoef > 0) then treasuryVolumeDiffAllocationCoefAbs else 0, + SCALE8 + ) + let donationProfitPart = donationProfitPartRaw - amountToInvestment + amountToDonation + let investmentProfitPart = investmentProfitPartRaw - amountToDonation + amountToInvestment + let investedWavesAmountNew = investedWavesAmount + investmentProfitPart + let investedXtnAmountNew = fraction(investedXtnAmountInWaves + donationProfitPart, SCALE8, xtnPrice) + let newPeriod = currentPeriodOrFail + 1 - # TODO: calculate new price - let newPrice = SCALE8 - - # burn total withdrawal amount + # calculate new price + let lpAssetQuantity = lpAssetIdOrFail.assetInfo() + .valueOrErrorMessage(wrapErr("invalid lpAsset info")).quantity + let newPrice = fraction(investedWavesAmountNew, SCALE8, lpAssetQuantity) + let lpAssetAmountToBurn = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) + let paymentAmountMin = fraction(lpAssetAmountToBurn, newPrice, SCALE8) + strict checkPaymentAmount = if ( + i.payments.size() == 1 + && i.payments[0].assetId == unit + && i.payments[0].amount >= paymentAmountMin + ) then true else throwErr("invalid payments") let factoryActions = [ # update period factoryAddressOrFail.invoke("integerEntry", [keyCurrentPeriod(), newPeriod], []), # update price factoryAddressOrFail.invoke("integerEntry", [keyPriceForPeriod(newPeriod), newPrice], []), + # burn total withdrawal amount factoryAddressOrFail.invoke("burn", [lpAssetAmountToBurn], []) - # factoryAddressOrFail.invoke("transferAsset", [ - # userAddressBytes, lpAssetAmount, lpAssetIdOrFail - # ], []), - # factoryAddressOrFail.invoke("transferWaves", [ - # treasuryAddressOrFail.bytes, paymentAmount - # ], [AttachedPayment(unit, paymentAmount)]) ] (nil, factoryActions) @@ -299,9 +352,9 @@ func claimWaves(userAddressBytes: ByteVector, txId: ByteVector) = { } else if (currentPeriodOrFail < targetPeriod) then { throwErr("invalid withdrawal request period") } else { - let currentPriceOrFail = - factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage(wrapErr("invalid price")) - let amount = if (currentPriceOrFail > 0) then fraction(lpAssetAmount, currentPriceOrFail, SCALE8) else 0 + let priceOrFail = + factoryAddressOrFail.getInteger(keyPriceForPeriod(targetPeriod)).valueOrErrorMessage(wrapErr("invalid price")) + let amount = if (priceOrFail > 0) then fraction(lpAssetAmount, priceOrFail, SCALE8) else 0 let factoryActions = [ factoryAddressOrFail.invoke("stringEntry", [ keyWithdrawalRequest(userAddress, txId), diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index 7a950bb..f891fab 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -5,6 +5,7 @@ | `%s__calculator` | `String` | | `%s__treasury` | `String` | | `%s__lpAssetId` | `String` | +| `%s__xtnAssetId` | `String` | | `%s__currentPeriod` | `Int` | | `%s__periodLength` | `Int` | | `%s%d__startHeight__` | `Int` | From d31bc47839097af8ebf8ceb7a919273b46f3a4f4 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Tue, 20 Jun 2023 18:17:05 +0500 Subject: [PATCH 061/143] factory finalize implemented --- contracts/factory/factory.ride | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 47fd323..389aad3 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -133,8 +133,7 @@ func transferWaves(recepientBytes: ByteVector, amount: Int) = # finalize period @Callable(i) func finalize() = - throwErr("not implemented yet") - # (nil, calculatorAddressOrFail.reentrantInvoke("finalize", [i.caller.bytes], i.payments)) + (nil, calculatorAddressOrFail.reentrantInvoke("finalize", [i.caller.bytes], i.payments)) @Callable(i) func claimLP() = From 5d008ec729371525baaae5998ab4589a5f2f4b40 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Tue, 20 Jun 2023 18:19:46 +0500 Subject: [PATCH 062/143] finalize fix --- contracts/calculator/calculator.ride | 1 + contracts/factory/factory.ride | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index bcfe0f3..38ddb23 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -147,6 +147,7 @@ func claimLP(userAddressBytes: ByteVector) = { # (0, 1] - profit to investment @Callable(i) func finalize( + userAddressBytes: ByteVector, newTreasuryVolumeInWaves: Int, xtnPrice: Int, pwrManagersBonus: Int, # 0..1×10⁸ diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 389aad3..780d721 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -132,8 +132,27 @@ func transferWaves(recepientBytes: ByteVector, amount: Int) = # finalize period @Callable(i) -func finalize() = - (nil, calculatorAddressOrFail.reentrantInvoke("finalize", [i.caller.bytes], i.payments)) +func finalize( + newTreasuryVolumeInWaves: Int, + xtnPrice: Int, + pwrManagersBonus: Int, + treasuryVolumeDiffAllocationCoef: Int +) = { + ( + nil, + calculatorAddressOrFail.reentrantInvoke( + "finalize", + [ + i.caller.bytes, + newTreasuryVolumeInWaves, + xtnPrice, + pwrManagersBonus, + treasuryVolumeDiffAllocationCoef + ], + i.payments + ) + ) +} @Callable(i) func claimLP() = From dc46f598d235fa2f91e2cc2014b28292fce5ea16 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Tue, 20 Jun 2023 20:15:50 +0500 Subject: [PATCH 063/143] finalize test draft --- contracts/calculator/calculator.ride | 7 +- contracts/calculator/test/_setup.js | 16 ++++- contracts/calculator/test/finalize.spec.js | 80 ++++++++++++++++++++++ 3 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 contracts/calculator/test/finalize.spec.js diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 38ddb23..0beb45c 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -153,6 +153,7 @@ func finalize( pwrManagersBonus: Int, # 0..1×10⁸ treasuryVolumeDiffAllocationCoef: Int # -1..1×10⁸ ) = { + strict checkCaller = i.onlyFactory() let currentPeriodOrFail = factoryAddressOrFail.getInteger(keyCurrentPeriod()) .valueOrErrorMessage(wrapErr("invalid period")) @@ -172,7 +173,7 @@ func finalize( let periodEndHeight = currentStartHeight + periodLength - 1 strict checks = [ - i.originCaller == factoryAddressOrFail || throwErr("permission denied"), + i.originCaller == treasuryAddressOrFail || throwErr("permission denied"), nextBlockToProcess > periodEndHeight || throwErr("unprocessed blocks"), newTreasuryVolumeInWaves >= 0 || throwErr("invalid new treasury volume"), xtnPrice >= 0 || throwErr("invalid XTN price"), @@ -195,7 +196,9 @@ func finalize( then fraction(profitRaw, pwrManagersBonus, SCALE8) else 0 let profit = profitRaw - pwrManagersBonusAmount - let donationPart = fraction(investedXtnAmountInWaves, SCALE8, currentTreasuryVolumeInWaves) + let donationPart = if (currentTreasuryVolumeInWaves > 0) + then fraction(investedXtnAmountInWaves, SCALE8, currentTreasuryVolumeInWaves) + else 0 let donationProfitPartRaw = fraction(profit, donationPart, SCALE8) let investmentProfitPartRaw = profit - donationProfitPartRaw let treasuryVolumeDiffAllocationCoefAbs = abs(treasuryVolumeDiffAllocationCoef) diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index 55828e9..da56af8 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -14,7 +14,7 @@ import { const nonceLength = 3 const calculatorPath = format({ dir: 'contracts/calculator', base: 'calculator.ride' }) -const factoryMockPath = format({ dir: 'contracts/factory', base: 'factory.ride' }) +const factoryPath = format({ dir: 'contracts/factory', base: 'factory.ride' }) export const setup = async ({ periodLength = 2, @@ -58,6 +58,15 @@ export const setup = async ({ chainId }, accounts.factory.seed)) + const { id: xtnAssetId } = await broadcastAndWait(issue({ + name: 'XTN.', + description: '', + quantity: 1, + decimals: 6, + reissuable: true, + chainId + }, baseSeed)) + await broadcastAndWait(burn({ assetId: lpAssetId, amount: 1, @@ -78,6 +87,7 @@ export const setup = async ({ { key: '%s__calculator', type: 'string', value: accounts.calculator.address }, { key: '%s__treasury', type: 'string', value: daoAddress }, { key: '%s__lpAssetId', type: 'string', value: lpAssetId }, + { key: '%s__xtnAssetId', type: 'string', value: xtnAssetId }, { key: '%s__nextBlockToProcess', type: 'integer', value: nextBlockToProcess }, { key: '%s__currentPeriod', type: 'integer', value: currentPeriod }, { key: `%s%d__startHeight__${period}`, type: 'integer', value: nextBlockToProcess }, @@ -89,7 +99,7 @@ export const setup = async ({ }, accounts.factory.seed)) await setScriptFromFile(calculatorPath, accounts.calculator.seed) - await setScriptFromFile(factoryMockPath, accounts.factory.seed) + await setScriptFromFile(factoryPath, accounts.factory.seed) - return { accounts, lpAssetId, periodLength, blockProcessingReward, price } + return { accounts, lpAssetId, xtnAssetId, periodLength, blockProcessingReward, price } } diff --git a/contracts/calculator/test/finalize.spec.js b/contracts/calculator/test/finalize.spec.js new file mode 100644 index 0000000..7f47e49 --- /dev/null +++ b/contracts/calculator/test/finalize.spec.js @@ -0,0 +1,80 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { api, chainId, broadcastAndWait, daoSeed } from '../../../utils/api.js' +import { setup } from './_setup.js' +import { invokeScript } from '@waves/waves-transactions' + +chai.use(chaiAsPromised) +const { expect } = chai + +describe(`[${process.pid}] calculator: finalize`, () => { + let accounts + + before(async () => { + const { height } = await api.blocks.fetchHeight(); + ({ accounts } = await setup({ + nextBlockToProcess: height, + periodLength: 1 + })) + + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'processBlocks', args: [] }, + chainId + }, accounts.user1.seed)) + + // const paymentAmount = 1e8 + // await broadcastAndWait(invokeScript({ + // dApp: accounts.factory.address, + // call: { function: 'invest', args: [] }, + // payment: [{ assetId: null, amount: paymentAmount }], + // chainId + // }, accounts.user1.seed)) + }) + + it('only factory can call finalize', async () => { + const newTreasuryVolumeInWaves = 1000 * 1e8 + const xtnPrice = 0.05 * 1e8 + const pwrManagersBonus = 0.2 * 1e8 + const treasuryVolumeDiffAllocationCoef = 0 + + return expect(broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { + function: 'finalize', + args: [ + { type: 'integer', value: newTreasuryVolumeInWaves }, + { type: 'integer', value: xtnPrice }, + { type: 'integer', value: pwrManagersBonus }, + { type: 'integer', value: treasuryVolumeDiffAllocationCoef } + ] + }, + payment: [], + chainId + }, accounts.user1.seed))).to.be.rejectedWith('permission denied') + }) + + it('period should be finalized', async () => { + const paymentAmount = 1 + const newTreasuryVolumeInWaves = 1000 * 1e8 + const xtnPrice = 0.05 * 1e8 + const pwrManagersBonus = 0.2 * 1e8 + const treasuryVolumeDiffAllocationCoef = 0 + const { stateChanges } = await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { + function: 'finalize', + args: [ + { type: 'integer', value: newTreasuryVolumeInWaves }, + { type: 'integer', value: xtnPrice }, + { type: 'integer', value: pwrManagersBonus }, + { type: 'integer', value: treasuryVolumeDiffAllocationCoef } + ] + }, + payment: [{ assetId: null, amount: paymentAmount }], + chainId, + additionalFee: 4e5 + }, daoSeed)) + console.log(stateChanges) + }) +}) From dc277c79baf9ce42aa3e1e726d0708cf4223a6cd Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 21 Jun 2023 12:44:39 +0500 Subject: [PATCH 064/143] finalize fixes + price check --- contracts/calculator/test/_setup.js | 26 +++++++++++++++------- contracts/calculator/test/finalize.spec.js | 22 +++++++++--------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index da56af8..14ba89c 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -15,6 +15,7 @@ import { const nonceLength = 3 const calculatorPath = format({ dir: 'contracts/calculator', base: 'calculator.ride' }) const factoryPath = format({ dir: 'contracts/factory', base: 'factory.ride' }) +const scale8 = 1e8 export const setup = async ({ periodLength = 2, @@ -22,7 +23,9 @@ export const setup = async ({ nextBlockToProcess = 2, currentPeriod = 0, price = 100000000, - period = 0 + period = 0, + investedXtnAmount = 0, + investedWavesAmount = 0 } = {}) => { const nonce = wc.random(nonceLength, 'Buffer').toString('hex') const names = [ @@ -49,10 +52,13 @@ export const setup = async ({ }, baseSeed) await broadcastAndWait(massTransferTx) + const lpAssetAmountToIssueRaw = Math.floor(investedWavesAmount * price / scale8) + const lpAssetAmountToIssue = lpAssetAmountToIssueRaw === 0 ? 1 : lpAssetAmountToIssueRaw + const { id: lpAssetId } = await broadcastAndWait(issue({ name: 'WAVESDAOLP', description: '', - quantity: 1, + quantity: lpAssetAmountToIssue, decimals: 8, reissuable: true, chainId @@ -67,11 +73,13 @@ export const setup = async ({ chainId }, baseSeed)) - await broadcastAndWait(burn({ - assetId: lpAssetId, - amount: 1, - chainId - }, accounts.factory.seed)) + if (lpAssetAmountToIssueRaw === 0) { + await broadcastAndWait(burn({ + assetId: lpAssetId, + amount: 1, + chainId + }, accounts.factory.seed)) + } await broadcastAndWait(data({ additionalFee: 4e5, @@ -93,7 +101,9 @@ export const setup = async ({ { key: `%s%d__startHeight__${period}`, type: 'integer', value: nextBlockToProcess }, { key: `%s%d__price__${period}`, type: 'integer', value: price }, { key: '%s__periodLength', type: 'integer', value: periodLength }, - { key: '%s__blockProcessingReward', type: 'integer', value: blockProcessingReward } + { key: '%s__blockProcessingReward', type: 'integer', value: blockProcessingReward }, + { key: '%s%s__invested__WAVES', type: 'integer', value: investedWavesAmount }, + { key: `%s%s__invested__${xtnAssetId}`, type: 'integer', value: investedXtnAmount } ], chainId }, accounts.factory.seed)) diff --git a/contracts/calculator/test/finalize.spec.js b/contracts/calculator/test/finalize.spec.js index 7f47e49..82e1180 100644 --- a/contracts/calculator/test/finalize.spec.js +++ b/contracts/calculator/test/finalize.spec.js @@ -7,12 +7,14 @@ import { invokeScript } from '@waves/waves-transactions' chai.use(chaiAsPromised) const { expect } = chai +const scale8 = 1e8 + describe(`[${process.pid}] calculator: finalize`, () => { - let accounts + let accounts, lpAssetId before(async () => { const { height } = await api.blocks.fetchHeight(); - ({ accounts } = await setup({ + ({ accounts, lpAssetId } = await setup({ nextBlockToProcess: height, periodLength: 1 })) @@ -22,14 +24,6 @@ describe(`[${process.pid}] calculator: finalize`, () => { call: { function: 'processBlocks', args: [] }, chainId }, accounts.user1.seed)) - - // const paymentAmount = 1e8 - // await broadcastAndWait(invokeScript({ - // dApp: accounts.factory.address, - // call: { function: 'invest', args: [] }, - // payment: [{ assetId: null, amount: paymentAmount }], - // chainId - // }, accounts.user1.seed)) }) it('only factory can call finalize', async () => { @@ -60,7 +54,7 @@ describe(`[${process.pid}] calculator: finalize`, () => { const xtnPrice = 0.05 * 1e8 const pwrManagersBonus = 0.2 * 1e8 const treasuryVolumeDiffAllocationCoef = 0 - const { stateChanges } = await broadcastAndWait(invokeScript({ + await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, call: { function: 'finalize', @@ -75,6 +69,10 @@ describe(`[${process.pid}] calculator: finalize`, () => { chainId, additionalFee: 4e5 }, daoSeed)) - console.log(stateChanges) + const [{ quantity }] = await api.assets.fetchDetails([lpAssetId]) + const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') + const profit = newTreasuryVolumeInWaves + const expectedPrice = Math.floor(profit * (scale8 - pwrManagersBonus) / quantity) + expect(price).to.equal(expectedPrice) }) }) From 72ca5c988574af18034df5c6aad3e7b365eda6f8 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 21 Jun 2023 13:02:34 +0500 Subject: [PATCH 065/143] remove daoAddress export --- contracts/calculator/test/_setup.js | 4 ++-- contracts/calculator/test/process_blocks.spec.js | 8 ++++---- utils/api.js | 3 --- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index 14ba89c..3047275 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -9,7 +9,7 @@ import { format } from 'path' import { table, getBorderCharacters } from 'table' import { - chainId, broadcastAndWait, baseSeed, setScriptFromFile, daoAddress + chainId, broadcastAndWait, baseSeed, setScriptFromFile, daoSeed } from '../../../utils/api.js' const nonceLength = 3 @@ -93,7 +93,7 @@ export const setup = async ({ additionalFee: 4e5, data: [ { key: '%s__calculator', type: 'string', value: accounts.calculator.address }, - { key: '%s__treasury', type: 'string', value: daoAddress }, + { key: '%s__treasury', type: 'string', value: wc.address(daoSeed, chainId) }, { key: '%s__lpAssetId', type: 'string', value: lpAssetId }, { key: '%s__xtnAssetId', type: 'string', value: xtnAssetId }, { key: '%s__nextBlockToProcess', type: 'integer', value: nextBlockToProcess }, diff --git a/contracts/calculator/test/process_blocks.spec.js b/contracts/calculator/test/process_blocks.spec.js index ecd2250..a4f1608 100644 --- a/contracts/calculator/test/process_blocks.spec.js +++ b/contracts/calculator/test/process_blocks.spec.js @@ -1,9 +1,9 @@ import chai from 'chai' import chaiAsPromised from 'chai-as-promised' -import { api, daoAddress, chainId, broadcastAndWait, baseSeed } from '../../../utils/api.js' +import { api, chainId, broadcastAndWait, baseSeed, daoSeed } from '../../../utils/api.js' import { setup } from './_setup.js' import { invokeScript } from '@waves/waves-transactions' -import { address } from '@waves/ts-lib-crypto' +import wc from '@waves/ts-lib-crypto' chai.use(chaiAsPromised) const { expect } = chai @@ -19,7 +19,7 @@ describe(`[${process.pid}] calculator: process blocks`, () => { const targetHeight = 2 const response = await api.utils.fetchEvaluate( accounts.calculator.address, - `rewardForOption(blockInfoByHeight(${targetHeight}).value().rewards, Address(base58'${daoAddress}'))` + `rewardForOption(blockInfoByHeight(${targetHeight}).value().rewards, Address(base58'${wc.address(daoSeed, chainId)}'))` ) const expectedReward = 200000000 expect(response).to.not.have.property('error') @@ -37,7 +37,7 @@ describe(`[${process.pid}] calculator: process blocks`, () => { call: { function: 'claimLP', args: [] }, chainId }, baseSeed)) - const { balance } = await api.assets.fetchBalanceAddressAssetId(address(baseSeed, chainId), lpAssetId) + const { balance } = await api.assets.fetchBalanceAddressAssetId(wc.address(baseSeed, chainId), lpAssetId) const daoBlockReward = 2e8 const expectedBalance = daoBlockReward * periodLength - blockProcessingReward expect(balance).to.equal(expectedBalance) diff --git a/utils/api.js b/utils/api.js index dff53b5..796feac 100644 --- a/utils/api.js +++ b/utils/api.js @@ -3,12 +3,9 @@ import { nodeInteraction, setScript } from '@waves/waves-transactions' import { readFile } from 'fs/promises' import { env } from '../env.js' -import { address } from '@waves/ts-lib-crypto' export const { apiBase, chainId, baseSeed, daoSeed } = env(process.env.NETWORK) -export const daoAddress = address(daoSeed, chainId) - export const api = create(apiBase) export const largeNumbeConvertHeader = { headers: { Accept: 'application/json;large-significand-format=string' } } From e677475a93023d843a8f2a093e718252012cd813 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 21 Jun 2023 13:13:19 +0500 Subject: [PATCH 066/143] fix factory verifier --- contracts/factory/factory.ride | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 780d721..b4cbebf 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -183,6 +183,6 @@ func verify() = { let byProposal = votingResultAddressOrFail.getBoolean(keyProposalAllowBroadcast(this, tx.id)).valueOrElse(false) let byOwner = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) if (votingResultAddressOption != unit) then { - byProposal + byProposal || byOwner } else byOwner } From 4f57cdcbf2624ba915d351310095046aecf2b69f Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 21 Jun 2023 15:30:11 +0500 Subject: [PATCH 067/143] finalize can invoke anyone --- contracts/calculator/calculator.ride | 3 +-- contracts/calculator/test/finalize.spec.js | 22 ---------------------- 2 files changed, 1 insertion(+), 24 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 0beb45c..47ae16e 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -173,7 +173,6 @@ func finalize( let periodEndHeight = currentStartHeight + periodLength - 1 strict checks = [ - i.originCaller == treasuryAddressOrFail || throwErr("permission denied"), nextBlockToProcess > periodEndHeight || throwErr("unprocessed blocks"), newTreasuryVolumeInWaves >= 0 || throwErr("invalid new treasury volume"), xtnPrice >= 0 || throwErr("invalid XTN price"), @@ -229,7 +228,7 @@ func finalize( i.payments.size() == 1 && i.payments[0].assetId == unit && i.payments[0].amount >= paymentAmountMin - ) then true else throwErr("invalid payments") + ) then true else throwErr("invalid payments, payment amount min: " + paymentAmountMin.toString()) let factoryActions = [ # update period diff --git a/contracts/calculator/test/finalize.spec.js b/contracts/calculator/test/finalize.spec.js index 82e1180..8c5136e 100644 --- a/contracts/calculator/test/finalize.spec.js +++ b/contracts/calculator/test/finalize.spec.js @@ -26,28 +26,6 @@ describe(`[${process.pid}] calculator: finalize`, () => { }, accounts.user1.seed)) }) - it('only factory can call finalize', async () => { - const newTreasuryVolumeInWaves = 1000 * 1e8 - const xtnPrice = 0.05 * 1e8 - const pwrManagersBonus = 0.2 * 1e8 - const treasuryVolumeDiffAllocationCoef = 0 - - return expect(broadcastAndWait(invokeScript({ - dApp: accounts.factory.address, - call: { - function: 'finalize', - args: [ - { type: 'integer', value: newTreasuryVolumeInWaves }, - { type: 'integer', value: xtnPrice }, - { type: 'integer', value: pwrManagersBonus }, - { type: 'integer', value: treasuryVolumeDiffAllocationCoef } - ] - }, - payment: [], - chainId - }, accounts.user1.seed))).to.be.rejectedWith('permission denied') - }) - it('period should be finalized', async () => { const paymentAmount = 1 const newTreasuryVolumeInWaves = 1000 * 1e8 From d5c4c48433394f6e197acae45fa9c9819613bb29 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 21 Jun 2023 15:43:52 +0500 Subject: [PATCH 068/143] remove withdrawal in finalize --- contracts/calculator/calculator.ride | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 47ae16e..e727de6 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -236,7 +236,8 @@ func finalize( # update price factoryAddressOrFail.invoke("integerEntry", [keyPriceForPeriod(newPeriod), newPrice], []), # burn total withdrawal amount - factoryAddressOrFail.invoke("burn", [lpAssetAmountToBurn], []) + factoryAddressOrFail.invoke("burn", [lpAssetAmountToBurn], []), + factoryAddressOrFail.invoke("integerEntry", [keyWithdrawal(), 0], []) ] (nil, factoryActions) From 0f78fc3efebbf1462fe282886c9526d92e0398ef Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 21 Jun 2023 17:29:38 +0500 Subject: [PATCH 069/143] claim waves after finalization test --- contracts/calculator/calculator.ride | 9 +- contracts/calculator/test/claim_waves.spec.js | 88 +++++++++++++++++++ 2 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 contracts/calculator/test/claim_waves.spec.js diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index e727de6..13525d7 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -249,9 +249,11 @@ func invest(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() let userAddress = Address(userAddressBytes) let currentPeriodOrFail = - factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage(wrapErr("invalid period")) + factoryAddressOrFail.getInteger(keyCurrentPeriod()) + .valueOrErrorMessage(wrapErr("invalid period")) let currentPriceOrFail = - factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)).valueOrErrorMessage(wrapErr("invalid price")) + factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)) + .valueOrErrorMessage(wrapErr("invalid price")) let payment = if (i.payments.size() == 1) then i.payments[0] else throwErr("invalid payments") let paymentAmount = if (payment.assetId == unit && payment.amount > 0) then { payment.amount @@ -282,7 +284,8 @@ func withdraw(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() let userAddress = Address(userAddressBytes) let currentPeriodOrFail = - factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage(wrapErr("invalid period")) + factoryAddressOrFail.getInteger(keyCurrentPeriod()) + .valueOrErrorMessage(wrapErr("invalid period")) let payment = if (i.payments.size() == 1) then i.payments[0] else throwErr(wrapErr("invalid payments")) let paymentAssetId = if (payment.assetId == lpAssetIdOrFail) then lpAssetIdOrFail else throwErr("invalid payment asset") let paymentAmount = if (payment.amount > 0) then payment.amount else throwErr("invalid payment amount") diff --git a/contracts/calculator/test/claim_waves.spec.js b/contracts/calculator/test/claim_waves.spec.js new file mode 100644 index 0000000..fab8789 --- /dev/null +++ b/contracts/calculator/test/claim_waves.spec.js @@ -0,0 +1,88 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { api, chainId, broadcastAndWait, daoSeed } from '../../../utils/api.js' +import { setup } from './_setup.js' +import { invokeScript } from '@waves/waves-transactions' + +chai.use(chaiAsPromised) +const { expect } = chai + +const scale8 = 1e8 + +describe(`[${process.pid}] calculator: claim waves`, () => { + let accounts, lpAssetId, investedWavesAmount + + before(async () => { + const { height } = await api.blocks.fetchHeight() + investedWavesAmount = 500 * 1e8; + ({ accounts, lpAssetId } = await setup({ + investedWavesAmount, + nextBlockToProcess: height, + periodLength: 1 + })) + + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'processBlocks', args: [] }, + chainId + }, accounts.user1.seed)) + + const paymentAmount = 1e8 + investedWavesAmount += paymentAmount + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'invest', args: [] }, + payment: [{ assetId: null, amount: paymentAmount }], + chainId + }, accounts.user1.seed)) + }) + + it('user should successfully claim waves after finalization', async () => { + const paymentAmount = 1e8 + const { id: withdrawTxId } = await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'withdraw', args: [] }, + payment: [{ assetId: lpAssetId, amount: paymentAmount }], + chainId + }, accounts.user1.seed)) + + const finalizePaymentAmount = 100e8 + const newTreasuryVolumeInWaves = 1000 * 1e8 + const xtnPrice = 0.05 * 1e8 + const pwrManagersBonus = 0.2 * 1e8 + const treasuryVolumeDiffAllocationCoef = 0 + const [{ quantity }] = await api.assets.fetchDetails([lpAssetId]) + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { + function: 'finalize', + args: [ + { type: 'integer', value: newTreasuryVolumeInWaves }, + { type: 'integer', value: xtnPrice }, + { type: 'integer', value: pwrManagersBonus }, + { type: 'integer', value: treasuryVolumeDiffAllocationCoef } + ] + }, + payment: [{ assetId: null, amount: finalizePaymentAmount }], + chainId, + additionalFee: 4e5 + }, daoSeed)) + + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { + function: 'claimWaves', + args: [ + { type: 'string', value: withdrawTxId } + ] + }, + chainId + }, accounts.user1.seed)) + + const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') + const profitRaw = newTreasuryVolumeInWaves - investedWavesAmount + const profit = profitRaw - profitRaw * pwrManagersBonus / scale8 + const expectedPrice = Math.floor((investedWavesAmount + profit) * scale8 / quantity) + expect(price).to.equal(expectedPrice) + }) +}) From 19b7f4244ad70e9fdd68e8e7ab7847040fd22633 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 21 Jun 2023 17:50:41 +0500 Subject: [PATCH 070/143] check claimed waves amount in test --- contracts/calculator/test/claim_waves.spec.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/contracts/calculator/test/claim_waves.spec.js b/contracts/calculator/test/claim_waves.spec.js index fab8789..c139cb5 100644 --- a/contracts/calculator/test/claim_waves.spec.js +++ b/contracts/calculator/test/claim_waves.spec.js @@ -68,7 +68,7 @@ describe(`[${process.pid}] calculator: claim waves`, () => { additionalFee: 4e5 }, daoSeed)) - await broadcastAndWait(invokeScript({ + const { stateChanges } = await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, call: { function: 'claimWaves', @@ -79,10 +79,17 @@ describe(`[${process.pid}] calculator: claim waves`, () => { chainId }, accounts.user1.seed)) + const transfer = stateChanges.invokes[0].stateChanges.invokes[2].stateChanges.transfers[0] + const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') const profitRaw = newTreasuryVolumeInWaves - investedWavesAmount const profit = profitRaw - profitRaw * pwrManagersBonus / scale8 const expectedPrice = Math.floor((investedWavesAmount + profit) * scale8 / quantity) expect(price).to.equal(expectedPrice) + expect(transfer).to.deep.equal({ + address: accounts.user1.address, + asset: null, + amount: Math.floor(paymentAmount * price / scale8) + }) }) }) From 9564a8dbe5472b75a6a3c3ca02d72dfcb6f1dca1 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 21 Jun 2023 18:13:10 +0500 Subject: [PATCH 071/143] finalize test blocks should be processed before finalization --- contracts/calculator/test/finalize.spec.js | 32 +++++++++++++++++----- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/contracts/calculator/test/finalize.spec.js b/contracts/calculator/test/finalize.spec.js index 8c5136e..c09e956 100644 --- a/contracts/calculator/test/finalize.spec.js +++ b/contracts/calculator/test/finalize.spec.js @@ -11,6 +11,11 @@ const scale8 = 1e8 describe(`[${process.pid}] calculator: finalize`, () => { let accounts, lpAssetId + const paymentAmount = 1 + const newTreasuryVolumeInWaves = 1000 * 1e8 + const xtnPrice = 0.05 * 1e8 + const pwrManagersBonus = 0.2 * 1e8 + const treasuryVolumeDiffAllocationCoef = 0 before(async () => { const { height } = await api.blocks.fetchHeight(); @@ -18,20 +23,33 @@ describe(`[${process.pid}] calculator: finalize`, () => { nextBlockToProcess: height, periodLength: 1 })) + }) + it('blocks should be processed before finalization', async () => { + expect(broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { + function: 'finalize', + args: [ + { type: 'integer', value: newTreasuryVolumeInWaves }, + { type: 'integer', value: xtnPrice }, + { type: 'integer', value: pwrManagersBonus }, + { type: 'integer', value: treasuryVolumeDiffAllocationCoef } + ] + }, + payment: [{ assetId: null, amount: paymentAmount }], + chainId, + additionalFee: 4e5 + }, daoSeed))).to.be.rejectedWith('unprocessed blocks') + }) + + it('period should be finalized', async () => { await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, call: { function: 'processBlocks', args: [] }, chainId }, accounts.user1.seed)) - }) - it('period should be finalized', async () => { - const paymentAmount = 1 - const newTreasuryVolumeInWaves = 1000 * 1e8 - const xtnPrice = 0.05 * 1e8 - const pwrManagersBonus = 0.2 * 1e8 - const treasuryVolumeDiffAllocationCoef = 0 await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, call: { From aac8f079084a054305712dd4c3bc387fcd24cb54 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Wed, 21 Jun 2023 19:48:44 +0500 Subject: [PATCH 072/143] save period start height in finalize --- contracts/calculator/calculator.ride | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 13525d7..fcbcd5a 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -235,6 +235,7 @@ func finalize( factoryAddressOrFail.invoke("integerEntry", [keyCurrentPeriod(), newPeriod], []), # update price factoryAddressOrFail.invoke("integerEntry", [keyPriceForPeriod(newPeriod), newPrice], []), + factoryAddressOrFail.invoke("integerEntry", [keyStartHeight(newPeriod), periodEndHeight + 1], []), # burn total withdrawal amount factoryAddressOrFail.invoke("burn", [lpAssetAmountToBurn], []), factoryAddressOrFail.invoke("integerEntry", [keyWithdrawal(), 0], []) From 78fef5b4f04a8d9abc6f4bcc5b94c19e2722da30 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 22 Jun 2023 13:26:36 +0500 Subject: [PATCH 073/143] issue tx fix --- migrations/issue.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/migrations/issue.json b/migrations/issue.json index 8d75b15..c3d2e09 100644 --- a/migrations/issue.json +++ b/migrations/issue.json @@ -1,9 +1,10 @@ { "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", "quantity": 122581754945, + "decimals": 8, "fee": 100000000, - "name": "", - "description": "", + "name": "WAVESDLP", + "description": "WavesDAO liquidity provider token. https://wavesdao.tech/", "type": 3, "version": 2, "reissuable": true, From 1153c72659789e296843dfc1f4e48041397bdbef Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 22 Jun 2023 13:50:57 +0500 Subject: [PATCH 074/143] only treasury can finalize --- contracts/calculator/calculator.ride | 1 + contracts/calculator/test/finalize.spec.js | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index fcbcd5a..5cda55d 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -173,6 +173,7 @@ func finalize( let periodEndHeight = currentStartHeight + periodLength - 1 strict checks = [ + i.originCaller == treasuryAddressOrFail || throwErr("permission denied"), nextBlockToProcess > periodEndHeight || throwErr("unprocessed blocks"), newTreasuryVolumeInWaves >= 0 || throwErr("invalid new treasury volume"), xtnPrice >= 0 || throwErr("invalid XTN price"), diff --git a/contracts/calculator/test/finalize.spec.js b/contracts/calculator/test/finalize.spec.js index c09e956..2a4aa6c 100644 --- a/contracts/calculator/test/finalize.spec.js +++ b/contracts/calculator/test/finalize.spec.js @@ -25,6 +25,28 @@ describe(`[${process.pid}] calculator: finalize`, () => { })) }) + it('only factory can call finalize', async () => { + const newTreasuryVolumeInWaves = 1000 * 1e8 + const xtnPrice = 0.05 * 1e8 + const pwrManagersBonus = 0.2 * 1e8 + const treasuryVolumeDiffAllocationCoef = 0 + + return expect(broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { + function: 'finalize', + args: [ + { type: 'integer', value: newTreasuryVolumeInWaves }, + { type: 'integer', value: xtnPrice }, + { type: 'integer', value: pwrManagersBonus }, + { type: 'integer', value: treasuryVolumeDiffAllocationCoef } + ] + }, + payment: [], + chainId + }, accounts.user1.seed))).to.be.rejectedWith('permission denied') + }) + it('blocks should be processed before finalization', async () => { expect(broadcastAndWait(invokeScript({ dApp: accounts.factory.address, From 600a5c9a4044137c715c5c09c6b0d38d67e6e8f5 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 22 Jun 2023 14:10:08 +0500 Subject: [PATCH 075/143] fix finalize payment validation --- contracts/calculator/calculator.ride | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 5cda55d..4974258 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -226,9 +226,12 @@ func finalize( let lpAssetAmountToBurn = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) let paymentAmountMin = fraction(lpAssetAmountToBurn, newPrice, SCALE8) strict checkPaymentAmount = if ( - i.payments.size() == 1 - && i.payments[0].assetId == unit - && i.payments[0].amount >= paymentAmountMin + paymentAmountMin == 0 + || ( + i.payments.size() == 1 + && i.payments[0].assetId == unit + && i.payments[0].amount >= paymentAmountMin + ) ) then true else throwErr("invalid payments, payment amount min: " + paymentAmountMin.toString()) let factoryActions = [ From 864c381e108b049aeaa8c6adc49b3c57ae50becd Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 22 Jun 2023 14:31:02 +0500 Subject: [PATCH 076/143] decimals --- contracts/calculator/calculator.ride | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 4974258..174f71a 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -8,6 +8,8 @@ let SCALE8 = 100_000_000 let PENDING = "PENDING" let FINISHED = "FINISHED" let WAVES = "WAVES" +let wavesDecimals = 8 +let xtnDecimals = 6 func wrapErr(s: String) = { CONTRACT_NAME + ": " + s @@ -189,7 +191,11 @@ func finalize( keyInvested(unit) ).valueOrElse(0) - let investedXtnAmountInWaves = fraction(investedXtnAmount, xtnPrice, SCALE8) + let investedXtnAmountInWaves = fraction( + investedXtnAmount, + xtnPrice * wavesDecimals, + SCALE8 * xtnDecimals + ) let currentTreasuryVolumeInWaves = investedXtnAmountInWaves + investedWavesAmount let profitRaw = newTreasuryVolumeInWaves - currentTreasuryVolumeInWaves let pwrManagersBonusAmount = if (profitRaw > 0) @@ -215,7 +221,7 @@ func finalize( let donationProfitPart = donationProfitPartRaw - amountToInvestment + amountToDonation let investmentProfitPart = investmentProfitPartRaw - amountToDonation + amountToInvestment let investedWavesAmountNew = investedWavesAmount + investmentProfitPart - let investedXtnAmountNew = fraction(investedXtnAmountInWaves + donationProfitPart, SCALE8, xtnPrice) + let investedXtnAmountNew = fraction(investedXtnAmountInWaves + donationProfitPart, SCALE8 * xtnDecimals, xtnPrice * wavesDecimals) let newPeriod = currentPeriodOrFail + 1 # calculate new price From 78c0cacd335f93741ce3cd487fb7f9140845a0f4 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 22 Jun 2023 14:41:03 +0500 Subject: [PATCH 077/143] fix decimals --- contracts/calculator/calculator.ride | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 174f71a..fbcf5b2 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -5,11 +5,10 @@ let SEP = "__" let CONTRACT_NAME = "calculator.ride" let SCALE8 = 100_000_000 +let SCALE6 = 1_000_000 let PENDING = "PENDING" let FINISHED = "FINISHED" let WAVES = "WAVES" -let wavesDecimals = 8 -let xtnDecimals = 6 func wrapErr(s: String) = { CONTRACT_NAME + ": " + s @@ -193,8 +192,8 @@ func finalize( let investedXtnAmountInWaves = fraction( investedXtnAmount, - xtnPrice * wavesDecimals, - SCALE8 * xtnDecimals + xtnPrice, + SCALE6 ) let currentTreasuryVolumeInWaves = investedXtnAmountInWaves + investedWavesAmount let profitRaw = newTreasuryVolumeInWaves - currentTreasuryVolumeInWaves @@ -221,7 +220,7 @@ func finalize( let donationProfitPart = donationProfitPartRaw - amountToInvestment + amountToDonation let investmentProfitPart = investmentProfitPartRaw - amountToDonation + amountToInvestment let investedWavesAmountNew = investedWavesAmount + investmentProfitPart - let investedXtnAmountNew = fraction(investedXtnAmountInWaves + donationProfitPart, SCALE8 * xtnDecimals, xtnPrice * wavesDecimals) + let investedXtnAmountNew = fraction(investedXtnAmountInWaves + donationProfitPart, SCALE6, xtnPrice) let newPeriod = currentPeriodOrFail + 1 # calculate new price From c1b3d11fb9ad70628d497b1fee900469d61beed7 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 22 Jun 2023 14:46:45 +0500 Subject: [PATCH 078/143] investedXtnAmountInWaves comment --- contracts/calculator/calculator.ride | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index fbcf5b2..e973a25 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -190,6 +190,12 @@ func finalize( keyInvested(unit) ).valueOrElse(0) + # wavesDecimalsMultiplier = 10⁸ + # xtnDecimalsMultiplier = 10⁶ + # xtnPriceMultiplier = 10⁸ + # investedXtnAmountInWaves + # = investedXtnAmount × xtnPrice × wavesDecimalsMultiplier / (xtnDecimalsMultiplier × xtnPriceMultiplier) + # = investedXtnAmount × xtnPrice / xtnDecimalsMultiplier let investedXtnAmountInWaves = fraction( investedXtnAmount, xtnPrice, From 34f701c894c8f643c8557f07e4ee973334d0d573 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 22 Jun 2023 15:32:53 +0500 Subject: [PATCH 079/143] txs --- migrations/calculator_set_factory.json | 15 +++++++ ...itial_investors.json => factory_init.json} | 45 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 migrations/calculator_set_factory.json rename migrations/{initial_investors.json => factory_init.json} (85%) diff --git a/migrations/calculator_set_factory.json b/migrations/calculator_set_factory.json new file mode 100644 index 0000000..741d68c --- /dev/null +++ b/migrations/calculator_set_factory.json @@ -0,0 +1,15 @@ +{ + "senderPublicKey": "5bMfubGtox2yqxppNu4UAYvuynNK79GEo4eyPUjK6j2s", + "data": [ + { + "key": "%s__factory", + "type": "string", + "value": "3PJVm7xLPabmYohbnvdgGDYHMwnZxF2x18m" + } + ], + "proofs": [], + "fee": 100000, + "type": 12, + "version": 2, + "chainId": 87 +} \ No newline at end of file diff --git a/migrations/initial_investors.json b/migrations/factory_init.json similarity index 85% rename from migrations/initial_investors.json rename to migrations/factory_init.json index 15454b4..7b8eca5 100644 --- a/migrations/initial_investors.json +++ b/migrations/factory_init.json @@ -1,6 +1,51 @@ { "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", "data": [ + { + "key": "%s__calculator", + "type": "string", + "value": "3P9eqGUMMYN7AESPJ5KaF15Awzm3uqAgcSa" + }, + { + "key": "%s__treasury", + "type": "string", + "value": "3PEgG7eZHLFhcfsTSaYxgRhZsh4AxMvA4Ms" + }, + { + "key": "%s__lpAssetId", + "type": "string", + "value": "" + }, + { + "key": "%s__xtnAssetId", + "type": "string", + "value": "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" + }, + { + "key": "%s__currentPeriod", + "type": "integer", + "value": 0 + }, + { + "key": "%s__periodLength", + "type": "integer", + "value": 129600 + }, + { + "key": "%s%d__startHeight__0", + "type": "integer", + "value": 3644396 + }, + { + "key": "%s%d__price__0", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s__nextBlockToProcess", + "type": "integer", + "value": 0 + }, { "key": "%s%s__invested__WAVES", "type": "integer", From 7b3abe48ee202773a58d2b08b042a47006ed06d1 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 22 Jun 2023 18:26:45 +0500 Subject: [PATCH 080/143] paymentAmountMin fix --- contracts/calculator/calculator.ride | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index e973a25..4114516 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -235,7 +235,7 @@ func finalize( let newPrice = fraction(investedWavesAmountNew, SCALE8, lpAssetQuantity) let lpAssetAmountToBurn = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) - let paymentAmountMin = fraction(lpAssetAmountToBurn, newPrice, SCALE8) + let paymentAmountMin = max([0, fraction(lpAssetAmountToBurn, newPrice, SCALE8)]) strict checkPaymentAmount = if ( paymentAmountMin == 0 || ( From bf0245a3aa7ee4714abffbecb729e8fc559e65fb Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Thu, 22 Jun 2023 19:27:05 +0500 Subject: [PATCH 081/143] power dao config address --- contracts/factory/factory.md | 1 + migrations/factory_init.json | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index f891fab..68c25f1 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -4,6 +4,7 @@ | :---------------------------- | :------- | | `%s__calculator` | `String` | | `%s__treasury` | `String` | +| `%s__config` | `String` | | `%s__lpAssetId` | `String` | | `%s__xtnAssetId` | `String` | | `%s__currentPeriod` | `Int` | diff --git a/migrations/factory_init.json b/migrations/factory_init.json index 7b8eca5..678afe6 100644 --- a/migrations/factory_init.json +++ b/migrations/factory_init.json @@ -6,6 +6,11 @@ "type": "string", "value": "3P9eqGUMMYN7AESPJ5KaF15Awzm3uqAgcSa" }, + { + "key": "%s__config", + "type": "string", + "value": "3PGWhtvCSz1TRJhe3BJSrvQigrtKuyXsgma" + }, { "key": "%s__treasury", "type": "string", From 63424595c8bd17dfbeec417560e17c7a1a201810 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 23 Jun 2023 12:54:41 +0500 Subject: [PATCH 082/143] add more data to processBlocks --- contracts/calculator/calculator.ride | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 4114516..f8d613f 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -456,6 +456,8 @@ func processBlocks(userAddressBytes: ByteVector) = { keyBlockProcessed(targetBlockHeight), makeString([ i.transactionId.toBase58String(), + currentPeriodOrFail.toString(), + generator.toString(), userAddressBytes.toBase58String(), treasuryRewardOrFail.toString(), callerReward.toString(), From 5aa35859baa12d83f029fcd441ecad236c1a28e8 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 23 Jun 2023 16:19:30 +0500 Subject: [PATCH 083/143] finalize, invest fix --- contracts/calculator/calculator.ride | 40 +++++++++++++++++----------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index f8d613f..30cb965 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -236,15 +236,22 @@ func finalize( let lpAssetAmountToBurn = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) let paymentAmountMin = max([0, fraction(lpAssetAmountToBurn, newPrice, SCALE8)]) - strict checkPaymentAmount = if ( + let paymentOption = if (i.payments.size() > 0) then i.payments[0] else unit + let paymentAmount = paymentOption.value().amount + let paymentAssetId = paymentOption.value().assetId + strict checkPayment = if ( paymentAmountMin == 0 || ( - i.payments.size() == 1 - && i.payments[0].assetId == unit - && i.payments[0].amount >= paymentAmountMin + paymentOption != unit + && paymentAssetId == unit + && paymentAmount >= paymentAmountMin ) ) then true else throwErr("invalid payments, payment amount min: " + paymentAmountMin.toString()) + let actions = if (paymentOption != unit) then [ + ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId) + ] else nil + let factoryActions = [ # update period factoryAddressOrFail.invoke("integerEntry", [keyCurrentPeriod(), newPeriod], []), @@ -256,7 +263,7 @@ func finalize( factoryAddressOrFail.invoke("integerEntry", [keyWithdrawal(), 0], []) ] - (nil, factoryActions) + (actions, factoryActions) } # payment in waves @@ -271,12 +278,16 @@ func invest(userAddressBytes: ByteVector) = { factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)) .valueOrErrorMessage(wrapErr("invalid price")) let payment = if (i.payments.size() == 1) then i.payments[0] else throwErr("invalid payments") - let paymentAmount = if (payment.assetId == unit && payment.amount > 0) then { - payment.amount + let (paymentAmount, paymentAssetId) = if (payment.assetId == unit && payment.amount > 0) then { + (payment.amount, payment.assetId) } else throwErr("invalid payment amount") let lpAssetAmount = if (currentPriceOrFail > 0) then fraction(paymentAmount, SCALE8, currentPriceOrFail) else 0 let invested = factoryAddressOrFail.getInteger(keyInvested(unit)).valueOrElse(0) + let actions = [ + ScriptTransfer(treasuryAddressOrFail, paymentAmount, paymentAssetId) + ] + let factoryActions = [ # increase invested amount factoryAddressOrFail.invoke("integerEntry", [ @@ -285,13 +296,10 @@ func invest(userAddressBytes: ByteVector) = { factoryAddressOrFail.invoke("reissue", [lpAssetAmount], []), factoryAddressOrFail.invoke("transferAsset", [ userAddressBytes, lpAssetAmount, lpAssetIdOrFail - ], []), - factoryAddressOrFail.invoke("transferWaves", [ - treasuryAddressOrFail.bytes, paymentAmount - ], [AttachedPayment(unit, paymentAmount)]) + ], []) ] - (nil, factoryActions) + (actions, factoryActions) } # payment in lp asset @@ -307,6 +315,10 @@ func withdraw(userAddressBytes: ByteVector) = { let paymentAmount = if (payment.amount > 0) then payment.amount else throwErr("invalid payment amount") let withdrawal = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) + let actions = [ + ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId) + ] + # increase total withdrawal amount strict factoryActions = [ factoryAddressOrFail.invoke("integerEntry", [ @@ -319,9 +331,7 @@ func withdraw(userAddressBytes: ByteVector) = { ], []) ] - ([ - ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId) - ], factoryActions) + (actions, factoryActions) } @Callable(i) From ca5051944a2ddcedea84125a6664806bcbaca4a2 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 23 Jun 2023 16:22:52 +0500 Subject: [PATCH 084/143] lpAssetId in init tx --- migrations/factory_init.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migrations/factory_init.json b/migrations/factory_init.json index 678afe6..f7a44cd 100644 --- a/migrations/factory_init.json +++ b/migrations/factory_init.json @@ -19,7 +19,7 @@ { "key": "%s__lpAssetId", "type": "string", - "value": "" + "value": "HYogWffUjS8Uw4bYA1Dn3qrGmJerMqkf139aJcHhk8yq" }, { "key": "%s__xtnAssetId", From 0c6776d89975cdd068432d9a4ff02a9fb5cb003f Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 23 Jun 2023 18:00:57 +0500 Subject: [PATCH 085/143] invest test update + daoAddress func --- contracts/calculator/test/_setup.js | 4 ++-- contracts/calculator/test/invest.spec.js | 16 +++++++++++----- contracts/calculator/test/process_blocks.spec.js | 4 ++-- utils/api.js | 3 +++ 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index 3047275..57ddf48 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -9,7 +9,7 @@ import { format } from 'path' import { table, getBorderCharacters } from 'table' import { - chainId, broadcastAndWait, baseSeed, setScriptFromFile, daoSeed + chainId, broadcastAndWait, baseSeed, setScriptFromFile, daoAddress } from '../../../utils/api.js' const nonceLength = 3 @@ -93,7 +93,7 @@ export const setup = async ({ additionalFee: 4e5, data: [ { key: '%s__calculator', type: 'string', value: accounts.calculator.address }, - { key: '%s__treasury', type: 'string', value: wc.address(daoSeed, chainId) }, + { key: '%s__treasury', type: 'string', value: daoAddress() }, { key: '%s__lpAssetId', type: 'string', value: lpAssetId }, { key: '%s__xtnAssetId', type: 'string', value: xtnAssetId }, { key: '%s__nextBlockToProcess', type: 'integer', value: nextBlockToProcess }, diff --git a/contracts/calculator/test/invest.spec.js b/contracts/calculator/test/invest.spec.js index 020a174..2242f0f 100644 --- a/contracts/calculator/test/invest.spec.js +++ b/contracts/calculator/test/invest.spec.js @@ -1,6 +1,6 @@ import chai from 'chai' import chaiAsPromised from 'chai-as-promised' -import { api, chainId, broadcastAndWait } from '../../../utils/api.js' +import { api, chainId, broadcastAndWait, daoAddress } from '../../../utils/api.js' import { setup } from './_setup.js' import { invokeScript } from '@waves/waves-transactions' @@ -14,7 +14,8 @@ describe(`[${process.pid}] calculator: invest`, () => { ({ accounts, lpAssetId, price } = await setup()) }) - it('user should receive lp tokens', async () => { + it('user should receive lp tokens, treasury should receive waves', async () => { + const { balance: treasuryBalanceBefore } = await api.addresses.fetchBalance(daoAddress()) const priceScale = 1e8 const paymentAmount = 1e8 await broadcastAndWait(invokeScript({ @@ -23,8 +24,13 @@ describe(`[${process.pid}] calculator: invest`, () => { payment: [{ assetId: null, amount: paymentAmount }], chainId }, accounts.user1.seed)) - const { balance } = await api.assets.fetchBalanceAddressAssetId(accounts.user1.address, lpAssetId) - const expectedBalance = paymentAmount * priceScale / price - expect(balance).to.equal(expectedBalance) + + const { balance: userBalance } = await api.assets.fetchBalanceAddressAssetId(accounts.user1.address, lpAssetId) + const expectedUserBalance = Math.floor(paymentAmount * priceScale / price) + expect(userBalance, 'invalid user balance').to.equal(expectedUserBalance) + + const { balance: treasuryBalanceAfter } = await api.addresses.fetchBalance(daoAddress()) + const expectedTreasuryBalance = treasuryBalanceBefore + paymentAmount + expect(treasuryBalanceAfter, 'invalid treasury balance').to.equal(expectedTreasuryBalance) }) }) diff --git a/contracts/calculator/test/process_blocks.spec.js b/contracts/calculator/test/process_blocks.spec.js index a4f1608..a71acf0 100644 --- a/contracts/calculator/test/process_blocks.spec.js +++ b/contracts/calculator/test/process_blocks.spec.js @@ -1,6 +1,6 @@ import chai from 'chai' import chaiAsPromised from 'chai-as-promised' -import { api, chainId, broadcastAndWait, baseSeed, daoSeed } from '../../../utils/api.js' +import { api, chainId, broadcastAndWait, baseSeed, daoAddress } from '../../../utils/api.js' import { setup } from './_setup.js' import { invokeScript } from '@waves/waves-transactions' import wc from '@waves/ts-lib-crypto' @@ -19,7 +19,7 @@ describe(`[${process.pid}] calculator: process blocks`, () => { const targetHeight = 2 const response = await api.utils.fetchEvaluate( accounts.calculator.address, - `rewardForOption(blockInfoByHeight(${targetHeight}).value().rewards, Address(base58'${wc.address(daoSeed, chainId)}'))` + `rewardForOption(blockInfoByHeight(${targetHeight}).value().rewards, Address(base58'${daoAddress()}'))` ) const expectedReward = 200000000 expect(response).to.not.have.property('error') diff --git a/utils/api.js b/utils/api.js index 796feac..bf75a07 100644 --- a/utils/api.js +++ b/utils/api.js @@ -3,9 +3,12 @@ import { nodeInteraction, setScript } from '@waves/waves-transactions' import { readFile } from 'fs/promises' import { env } from '../env.js' +import { address } from '@waves/ts-lib-crypto' export const { apiBase, chainId, baseSeed, daoSeed } = env(process.env.NETWORK) +export const daoAddress = () => address(daoSeed, chainId) + export const api = create(apiBase) export const largeNumbeConvertHeader = { headers: { Accept: 'application/json;large-significand-format=string' } } From 6966a4245b5a6a171cef6cd6e5cf6b5be6d784d1 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 23 Jun 2023 18:12:02 +0500 Subject: [PATCH 086/143] finalize test update check factory balance --- contracts/calculator/test/finalize.spec.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/contracts/calculator/test/finalize.spec.js b/contracts/calculator/test/finalize.spec.js index 2a4aa6c..10182fe 100644 --- a/contracts/calculator/test/finalize.spec.js +++ b/contracts/calculator/test/finalize.spec.js @@ -72,6 +72,8 @@ describe(`[${process.pid}] calculator: finalize`, () => { chainId }, accounts.user1.seed)) + const { balance: factoryBalanceBefore } = await api.addresses.fetchBalance(accounts.factory.address) + await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, call: { @@ -87,10 +89,15 @@ describe(`[${process.pid}] calculator: finalize`, () => { chainId, additionalFee: 4e5 }, daoSeed)) + + const { balance: factoryBalanceAfter } = await api.addresses.fetchBalance(accounts.factory.address) + const [{ quantity }] = await api.assets.fetchDetails([lpAssetId]) const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') const profit = newTreasuryVolumeInWaves const expectedPrice = Math.floor(profit * (scale8 - pwrManagersBonus) / quantity) - expect(price).to.equal(expectedPrice) + expect(price, 'invalid price').to.equal(expectedPrice) + const expectedFactoryBalance = factoryBalanceBefore + paymentAmount + expect(factoryBalanceAfter, 'invalid factory balance').to.equal(expectedFactoryBalance) }) }) From 1a3ab49e1d7dcf22d8295ba8a49bc6790e783828 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 23 Jun 2023 18:27:11 +0500 Subject: [PATCH 087/143] withdraw test update check factory balance --- contracts/calculator/test/withdraw.spec.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/contracts/calculator/test/withdraw.spec.js b/contracts/calculator/test/withdraw.spec.js index 891af4d..2f62bce 100644 --- a/contracts/calculator/test/withdraw.spec.js +++ b/contracts/calculator/test/withdraw.spec.js @@ -23,6 +23,7 @@ describe(`[${process.pid}] calculator: withdraw`, () => { }) it('total withdrawal amount should be increased', async () => { + const { balance: factoryBalanceBefore } = await api.assets.fetchBalanceAddressAssetId(accounts.factory.address, lpAssetId) const paymentAmount = 1e8 await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, @@ -30,7 +31,10 @@ describe(`[${process.pid}] calculator: withdraw`, () => { payment: [{ assetId: lpAssetId, amount: paymentAmount }], chainId }, accounts.user1.seed)) + const { balance: factoryBalanceAfter } = await api.assets.fetchBalanceAddressAssetId(accounts.factory.address, lpAssetId) const { value: totalWithdrawalAmount } = await api.addresses.fetchDataKey(accounts.factory.address, '%s__withdrawal') - expect(totalWithdrawalAmount).to.equal(paymentAmount) + expect(totalWithdrawalAmount, 'invalid total withdrawal amount').to.equal(paymentAmount) + const expectedFactoryBalance = factoryBalanceBefore + paymentAmount + expect(factoryBalanceAfter, 'invalid factory balance').to.equal(expectedFactoryBalance) }) }) From 49b3e2169d3e9cd97f0c63adf3ece3903c24b8a2 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 23 Jun 2023 18:27:44 +0500 Subject: [PATCH 088/143] gitignore fix --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 02960a4..8d8a53f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules .idea .vscode +/scripts/data.js From 5015d0f1ce9643854419b42e970d1d3bd35b980a Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 23 Jun 2023 18:33:20 +0500 Subject: [PATCH 089/143] cancel withdraw test update check user balance --- contracts/calculator/test/cancel_withdraw.spec.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/contracts/calculator/test/cancel_withdraw.spec.js b/contracts/calculator/test/cancel_withdraw.spec.js index bad901c..25398be 100644 --- a/contracts/calculator/test/cancel_withdraw.spec.js +++ b/contracts/calculator/test/cancel_withdraw.spec.js @@ -30,6 +30,7 @@ describe(`[${process.pid}] calculator: cancel withdraw`, () => { }) it('total withdrawal amount should be decreased', async () => { + const { balance: userBalanceBefore } = await api.assets.fetchBalanceAddressAssetId(accounts.user1.address, lpAssetId) const paymentAmount = 1e8 const { value: totalWithdrawalAmountBefore } = await api.addresses.fetchDataKey(accounts.factory.address, '%s__withdrawal') expect(totalWithdrawalAmountBefore).to.equal(paymentAmount) @@ -38,7 +39,12 @@ describe(`[${process.pid}] calculator: cancel withdraw`, () => { call: { function: 'cancelWithdraw', args: [{ type: 'string', value: withdrawTxId }] }, chainId }, accounts.user1.seed)) + const { balance: userBalanceAfter } = await api.assets.fetchBalanceAddressAssetId(accounts.user1.address, lpAssetId) const { value: totalWithdrawalAmountAfter } = await api.addresses.fetchDataKey(accounts.factory.address, '%s__withdrawal') - expect(totalWithdrawalAmountAfter).to.equal(0) + expect(totalWithdrawalAmountAfter, 'invalid total withdrawal amount').to.equal(0) + // price is 1 + const lpAssetAmount = paymentAmount + const expectedUserBalance = userBalanceBefore + lpAssetAmount + expect(userBalanceAfter, 'invalid user balance').to.equal(expectedUserBalance) }) }) From fba5ab926c089c64299946c1c0f1636f84c9e4fd Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 23 Jun 2023 18:40:49 +0500 Subject: [PATCH 090/143] cancel withdraw test fix --- contracts/calculator/test/cancel_withdraw.spec.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/contracts/calculator/test/cancel_withdraw.spec.js b/contracts/calculator/test/cancel_withdraw.spec.js index 25398be..f128cf0 100644 --- a/contracts/calculator/test/cancel_withdraw.spec.js +++ b/contracts/calculator/test/cancel_withdraw.spec.js @@ -42,9 +42,7 @@ describe(`[${process.pid}] calculator: cancel withdraw`, () => { const { balance: userBalanceAfter } = await api.assets.fetchBalanceAddressAssetId(accounts.user1.address, lpAssetId) const { value: totalWithdrawalAmountAfter } = await api.addresses.fetchDataKey(accounts.factory.address, '%s__withdrawal') expect(totalWithdrawalAmountAfter, 'invalid total withdrawal amount').to.equal(0) - // price is 1 - const lpAssetAmount = paymentAmount - const expectedUserBalance = userBalanceBefore + lpAssetAmount + const expectedUserBalance = userBalanceBefore + paymentAmount expect(userBalanceAfter, 'invalid user balance').to.equal(expectedUserBalance) }) }) From 1b9b92e0ffc7e60a7fffdba89b1b4bb8e850a15d Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 23 Jun 2023 18:43:31 +0500 Subject: [PATCH 091/143] remove treasury balance validation from invest test --- contracts/calculator/test/invest.spec.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/contracts/calculator/test/invest.spec.js b/contracts/calculator/test/invest.spec.js index 2242f0f..f2b9c79 100644 --- a/contracts/calculator/test/invest.spec.js +++ b/contracts/calculator/test/invest.spec.js @@ -1,6 +1,6 @@ import chai from 'chai' import chaiAsPromised from 'chai-as-promised' -import { api, chainId, broadcastAndWait, daoAddress } from '../../../utils/api.js' +import { api, chainId, broadcastAndWait } from '../../../utils/api.js' import { setup } from './_setup.js' import { invokeScript } from '@waves/waves-transactions' @@ -15,7 +15,6 @@ describe(`[${process.pid}] calculator: invest`, () => { }) it('user should receive lp tokens, treasury should receive waves', async () => { - const { balance: treasuryBalanceBefore } = await api.addresses.fetchBalance(daoAddress()) const priceScale = 1e8 const paymentAmount = 1e8 await broadcastAndWait(invokeScript({ @@ -28,9 +27,5 @@ describe(`[${process.pid}] calculator: invest`, () => { const { balance: userBalance } = await api.assets.fetchBalanceAddressAssetId(accounts.user1.address, lpAssetId) const expectedUserBalance = Math.floor(paymentAmount * priceScale / price) expect(userBalance, 'invalid user balance').to.equal(expectedUserBalance) - - const { balance: treasuryBalanceAfter } = await api.addresses.fetchBalance(daoAddress()) - const expectedTreasuryBalance = treasuryBalanceBefore + paymentAmount - expect(treasuryBalanceAfter, 'invalid treasury balance').to.equal(expectedTreasuryBalance) }) }) From 960e0e66d14faf2b86fbbccc4aa92456e0c86864 Mon Sep 17 00:00:00 2001 From: Waves Rider <108881461+ridev6@users.noreply.github.com> Date: Fri, 23 Jun 2023 19:22:37 +0500 Subject: [PATCH 092/143] estimated height of fearure 19 activation in init --- migrations/factory_init.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migrations/factory_init.json b/migrations/factory_init.json index f7a44cd..3ea39e4 100644 --- a/migrations/factory_init.json +++ b/migrations/factory_init.json @@ -49,7 +49,7 @@ { "key": "%s__nextBlockToProcess", "type": "integer", - "value": 0 + "value": 3720000 }, { "key": "%s%s__invested__WAVES", From 301fd896c4ca1fce746b25ba315e70b86b753847 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Sun, 2 Jul 2023 16:12:24 +0300 Subject: [PATCH 093/143] Transfer reward funds to Feature Treasury Changed processBlock in Calculator processBlock function calculates Total Reward from processed blocks Initiates rewards distribution from Proxy Treasury Processing Reward amount from Proxy Treasury to Factory Processing Reward amount from Factory to User Remaining amount from Proxy Treasury to Feature Treasury New function in Proxy Treasury Send requested amount Waves to Recipient Can only be called by Factory New key in Factory %s__featureTreasury New function in Factory transferFromProxyTreasury() initiates transfer from Proxy Treasury Can only be called by Calculator --- .gitignore | 1 + contracts/calculator/calculator.ride | 30 +++++++++++++++++++++++----- contracts/calculator/test/_setup.js | 2 ++ contracts/factory/factory.ride | 10 ++++++++++ contracts/treasury/treasury.ride | 26 ++++++++++++++++++++++++ 5 files changed, 64 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 8d8a53f..a405cbc 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules .idea .vscode /scripts/data.js +package-lock.json \ No newline at end of file diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 30cb965..baa59b0 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -33,6 +33,7 @@ func keyFactoryAddress() = ["%s", "factory"].makeString(SEP) func keyLpAssetId() = ["%s", "lpAssetId"].makeString(SEP) func keyXtnAssetId() = ["%s", "xtnAssetId"].makeString(SEP) func keyTreasuryAddress() = ["%s", "treasury"].makeString(SEP) +func keyFeatureTreasuryAddress() = ["%s", "featureTreasury"].makeString(SEP) func keyInvested(assetId: ByteVector|Unit) = ["%s%s", "invested", assetIdToString(assetId)].makeString(SEP) func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toString()].makeString(SEP) func keyClaimed(userAddress: Address) = ["%s%s", "claimed", userAddress.toString()].makeString(SEP) @@ -97,7 +98,16 @@ let treasuryAddressOption = match factoryAddressOption { } case _: Unit => unit } -let treasuryAddressOrFail = treasuryAddressOption.valueOrErrorMessage(wrapErr("invalid treasury address")) +let treasuryAddressOrFail = treasuryAddressOption.valueOrErrorMessage(wrapErr("invalid proxy treasury address")) + +let featureTreasuryAddressOption = match factoryAddressOption { + case a: Address => match a.getString(keyFeatureTreasuryAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit + } + case _: Unit => unit +} +let featureTreasuryAddressOrFail = featureTreasuryAddressOption.valueOrErrorMessage(wrapErr("invalid feature treasury address")) func onlyAddress(i: Invocation, address: Address) = { i.caller == address || throwErr("permission denied") @@ -440,7 +450,7 @@ func processBlocks(userAddressBytes: ByteVector) = { let blockProcessingRewardByGenerator = blockProcessingReward / blocksProcessingBatchSize let blockProcessingRewardByGeneratorRemainder = blockProcessingReward - blockProcessingRewardByGenerator * blocksProcessingBatchSize - func map(acc: Int, inc: Int) = { + func map(acc: (Int, Int), inc: Int) = { if (inc >= blocksProcessingBatchSize) then { acc } else { @@ -479,8 +489,8 @@ func processBlocks(userAddressBytes: ByteVector) = { available + lpAssetAmount ], []) ] - - acc + lpAssetAmount + let (lpAssetAcc, rewardAcc) = acc + (lpAssetAcc + lpAssetAmount, rewardAcc + treasuryRewardOrFail) } } @@ -490,7 +500,9 @@ func processBlocks(userAddressBytes: ByteVector) = { 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 ] - strict lpAssetAmountTotal = FOLD<40>(list, 0, map) + strict (lpAssetAmountTotal, rewardAmountTotal) = FOLD<40>(list, (0, 0), map) + + let rewardToFeatureTreasuryAmount = rewardAmountTotal - blockProcessingReward strict actions = [ factoryAddressOrFail.invoke("transferWaves", [ @@ -502,6 +514,14 @@ func processBlocks(userAddressBytes: ByteVector) = { factoryAddressOrFail.invoke("integerEntry", [ keyNextBlockToProcess(), nextBlockToProcess + blocksProcessingBatchSize + ], []), + factoryAddressOrFail.invoke("transferFromProxyTreasury", [ + featureTreasuryAddressOrFail.bytes, + rewardToFeatureTreasuryAmount + ], []), + factoryAddressOrFail.invoke("transferFromProxyTreasury", [ + factoryAddressOrFail.bytes, + blockProcessingReward ], []) ] diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index 57ddf48..c8d7098 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -32,6 +32,7 @@ export const setup = async ({ 'factory', 'calculator', 'treasury', + 'featureTreasury', 'user1' ] const accounts = Object.fromEntries(names.map((item) => { @@ -94,6 +95,7 @@ export const setup = async ({ data: [ { key: '%s__calculator', type: 'string', value: accounts.calculator.address }, { key: '%s__treasury', type: 'string', value: daoAddress() }, + { key: '%s__featureTreasury', type: 'string', value: accounts.featureTreasury.address }, { key: '%s__lpAssetId', type: 'string', value: lpAssetId }, { key: '%s__xtnAssetId', type: 'string', value: xtnAssetId }, { key: '%s__nextBlockToProcess', type: 'integer', value: nextBlockToProcess }, diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index b4cbebf..fbe09b5 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -29,6 +29,12 @@ let calculatorAddressOption = match this.getString(keyCalculatorAddress()) { } let calculatorAddressOrFail = calculatorAddressOption.valueOrErrorMessage(wrapErr("invalid calculator address")) +let treasuryAddressOption = match this.getString(keyTreasuryAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit +} +let treasuryAddressOrFail = treasuryAddressOption.valueOrErrorMessage(wrapErr("invalid proxy treasury address")) + func keyConfigAddress() = "%s__config" # config keys @@ -130,6 +136,10 @@ func transferAsset(recepientBytes: ByteVector, amount: Int, assetId: ByteVector) func transferWaves(recepientBytes: ByteVector, amount: Int) = if (i.onlyCalculator()) then ([ScriptTransfer(Address(recepientBytes), amount, unit)], amount) else ([], unit) +@Callable(i) +func transferFromProxyTreasury(recipientBytes: ByteVector, rewardsAmount: Int) = + if (i.onlyCalculator()) then (nil, treasuryAddressOrFail.invoke("transferWaves", [recipientBytes, rewardsAmount], [])) else ([], unit) + # finalize period @Callable(i) func finalize( diff --git a/contracts/treasury/treasury.ride b/contracts/treasury/treasury.ride index 80a1dcd..cd1332f 100644 --- a/contracts/treasury/treasury.ride +++ b/contracts/treasury/treasury.ride @@ -24,6 +24,9 @@ func keyFullAdminVote(prefix: String, adminAddress: String) = makeString([prefix # Admin List key func keyAdminAddressList() = makeString(["%s", "adminAddressList"], SEP) +# Factory address key +func keyFactoryAddress() = makeString(["%s", "factory"], SEP) + # Allowed TXID key func keyAllowedTxId() = makeString(["%s", "txId"], SEP) @@ -37,6 +40,13 @@ let configAddressOption = match this.getString(keyConfigAddress()) { case _: Unit => unit } let configAddress = configAddressOption.valueOrErrorMessage(wrapErr("invalid config address")) + +let factoryAddressOption = match this.getString(keyFactoryAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit +} +let factoryAddressOrFail = factoryAddressOption.valueOrErrorMessage(wrapErr("invalid factory address")) + let votingResultContractOption = match configAddressOption { case a: Address => match a.getString(keyVotingResultAddress()) { case s: String => s.addressFromString() @@ -46,6 +56,14 @@ let votingResultContractOption = match configAddressOption { } let votingResultContract = votingResultContractOption.valueOrErrorMessage(wrapErr("invalid voting result address")) +func onlyAddress(i: Invocation, address: Address) = { + i.caller == address || throwErr("permission denied") +} + +func onlyFactory(i: Invocation) = { + onlyAddress(i, factoryAddressOrFail) +} + func getAdminVote(prefix: String, admin: String) = { let voteKey = keyFullAdminVote(prefix, admin) getInteger(voteKey).valueOrElse(0) @@ -115,6 +133,14 @@ func voteINTERNAL( } } +@Callable(i) +func transferWaves(recipientBytes: ByteVector, amount: Int) = { + strict checkCaller = i.onlyFactory() + [ + ScriptTransfer(Address(recipientBytes), amount, unit) + ] +} + # Vote for txId that is allowed in Verifier @Callable(i) func voteForTxId(txId: String) = { From 3ee688bfd4a648d5948e208a27e8bfd3ea70dd8d Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Mon, 3 Jul 2023 10:41:43 +0300 Subject: [PATCH 094/143] Changed donation to Waves Changed XTN donation value to Waves Removed donation conversions Changed finalize() caller to Feature Treasury --- .gitignore | 2 +- contracts/calculator/calculator.ride | 37 ++++------------------ contracts/factory/factory.ride | 2 -- migrations/factory_init.json | 9 ++++-- migrations/proxy_treasury_set_factory.json | 15 +++++++++ 5 files changed, 30 insertions(+), 35 deletions(-) create mode 100644 migrations/proxy_treasury_set_factory.json diff --git a/.gitignore b/.gitignore index a405cbc..e3c4256 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ node_modules .idea .vscode /scripts/data.js -package-lock.json \ No newline at end of file +package-lock.json diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index baa59b0..2cb9581 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -31,10 +31,10 @@ func abs(n: Int) = { func keyFactoryAddress() = ["%s", "factory"].makeString(SEP) func keyLpAssetId() = ["%s", "lpAssetId"].makeString(SEP) -func keyXtnAssetId() = ["%s", "xtnAssetId"].makeString(SEP) func keyTreasuryAddress() = ["%s", "treasury"].makeString(SEP) func keyFeatureTreasuryAddress() = ["%s", "featureTreasury"].makeString(SEP) func keyInvested(assetId: ByteVector|Unit) = ["%s%s", "invested", assetIdToString(assetId)].makeString(SEP) +func keyDonated(assetId: ByteVector|Unit) = ["%s%s", "donated", assetIdToString(assetId)].makeString(SEP) func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toString()].makeString(SEP) func keyClaimed(userAddress: Address) = ["%s%s", "claimed", userAddress.toString()].makeString(SEP) func keyCurrentPeriod() = ["%s", "currentPeriod"].makeString(SEP) @@ -82,15 +82,6 @@ let lpAssetIdOption = match factoryAddressOption { } let lpAssetIdOrFail = lpAssetIdOption.valueOrErrorMessage(wrapErr("invalid lpAssetId")) -let xtnAssetIdOption = match factoryAddressOption { - case a: Address => match a.getString(keyXtnAssetId()) { - case s: String => s.fromBase58String() - case _: Unit => unit - } - case _: Unit => unit -} -let xtnAssetIdOrFail = xtnAssetIdOption.valueOrErrorMessage(wrapErr("invalid xtnAssetId")) - let treasuryAddressOption = match factoryAddressOption { case a: Address => match a.getString(keyTreasuryAddress()) { case s: String => s.addressFromString() @@ -160,7 +151,6 @@ func claimLP(userAddressBytes: ByteVector) = { func finalize( userAddressBytes: ByteVector, newTreasuryVolumeInWaves: Int, - xtnPrice: Int, pwrManagersBonus: Int, # 0..1×10⁸ treasuryVolumeDiffAllocationCoef: Int # -1..1×10⁸ ) = { @@ -184,41 +174,29 @@ func finalize( let periodEndHeight = currentStartHeight + periodLength - 1 strict checks = [ - i.originCaller == treasuryAddressOrFail || throwErr("permission denied"), + i.originCaller == featureTreasuryAddressOrFail || throwErr("permission denied"), nextBlockToProcess > periodEndHeight || throwErr("unprocessed blocks"), newTreasuryVolumeInWaves >= 0 || throwErr("invalid new treasury volume"), - xtnPrice >= 0 || throwErr("invalid XTN price"), pwrManagersBonus >= 0 && pwrManagersBonus <= SCALE8 || throwErr("invalid PWR managers bonus"), treasuryVolumeDiffAllocationCoef >= -SCALE8 && treasuryVolumeDiffAllocationCoef <= SCALE8 || throwErr("invalid treasury volume diff allocation coefficient") ] - let investedXtnAmount = factoryAddressOrFail.getInteger( - keyInvested(xtnAssetIdOrFail) + let donatedWavesAmount = factoryAddressOrFail.getInteger( + keyDonated(unit) ).valueOrElse(0) let investedWavesAmount = factoryAddressOrFail.getInteger( keyInvested(unit) ).valueOrElse(0) - # wavesDecimalsMultiplier = 10⁸ - # xtnDecimalsMultiplier = 10⁶ - # xtnPriceMultiplier = 10⁸ - # investedXtnAmountInWaves - # = investedXtnAmount × xtnPrice × wavesDecimalsMultiplier / (xtnDecimalsMultiplier × xtnPriceMultiplier) - # = investedXtnAmount × xtnPrice / xtnDecimalsMultiplier - let investedXtnAmountInWaves = fraction( - investedXtnAmount, - xtnPrice, - SCALE6 - ) - let currentTreasuryVolumeInWaves = investedXtnAmountInWaves + investedWavesAmount + let currentTreasuryVolumeInWaves = donatedWavesAmount + investedWavesAmount let profitRaw = newTreasuryVolumeInWaves - currentTreasuryVolumeInWaves let pwrManagersBonusAmount = if (profitRaw > 0) then fraction(profitRaw, pwrManagersBonus, SCALE8) else 0 let profit = profitRaw - pwrManagersBonusAmount let donationPart = if (currentTreasuryVolumeInWaves > 0) - then fraction(investedXtnAmountInWaves, SCALE8, currentTreasuryVolumeInWaves) + then fraction(donatedWavesAmount, SCALE8, currentTreasuryVolumeInWaves) else 0 let donationProfitPartRaw = fraction(profit, donationPart, SCALE8) let investmentProfitPartRaw = profit - donationProfitPartRaw @@ -236,7 +214,6 @@ func finalize( let donationProfitPart = donationProfitPartRaw - amountToInvestment + amountToDonation let investmentProfitPart = investmentProfitPartRaw - amountToDonation + amountToInvestment let investedWavesAmountNew = investedWavesAmount + investmentProfitPart - let investedXtnAmountNew = fraction(investedXtnAmountInWaves + donationProfitPart, SCALE6, xtnPrice) let newPeriod = currentPeriodOrFail + 1 # calculate new price @@ -295,7 +272,7 @@ func invest(userAddressBytes: ByteVector) = { let invested = factoryAddressOrFail.getInteger(keyInvested(unit)).valueOrElse(0) let actions = [ - ScriptTransfer(treasuryAddressOrFail, paymentAmount, paymentAssetId) + ScriptTransfer(featureTreasuryAddressOrFail, paymentAmount, paymentAssetId) ] let factoryActions = [ diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index fbe09b5..ba3c87c 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -144,7 +144,6 @@ func transferFromProxyTreasury(recipientBytes: ByteVector, rewardsAmount: Int) = @Callable(i) func finalize( newTreasuryVolumeInWaves: Int, - xtnPrice: Int, pwrManagersBonus: Int, treasuryVolumeDiffAllocationCoef: Int ) = { @@ -155,7 +154,6 @@ func finalize( [ i.caller.bytes, newTreasuryVolumeInWaves, - xtnPrice, pwrManagersBonus, treasuryVolumeDiffAllocationCoef ], diff --git a/migrations/factory_init.json b/migrations/factory_init.json index 3ea39e4..0f835df 100644 --- a/migrations/factory_init.json +++ b/migrations/factory_init.json @@ -16,6 +16,11 @@ "type": "string", "value": "3PEgG7eZHLFhcfsTSaYxgRhZsh4AxMvA4Ms" }, + { + "key": "%s__featureTreasury", + "type": "string", + "value": "" + }, { "key": "%s__lpAssetId", "type": "string", @@ -57,9 +62,9 @@ "value": 122581754945 }, { - "key": "%s%s__invested__DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p", + "key": "%s%s__donated__WAVES", "type": "integer", - "value": 19600000000000 + "value": 0 }, { "key": "%s%s__available__3P2EDoG2nxrXGwcGT8RkGhWJje61ZMCuXr3", diff --git a/migrations/proxy_treasury_set_factory.json b/migrations/proxy_treasury_set_factory.json new file mode 100644 index 0000000..a4ede2a --- /dev/null +++ b/migrations/proxy_treasury_set_factory.json @@ -0,0 +1,15 @@ +{ + "senderPublicKey": "GDPfYHA6NUZCmin3J7LWZhCvSjBcna8HebyvQyrw17v", + "data": [ + { + "key": "%s__factory", + "type": "string", + "value": "3PJVm7xLPabmYohbnvdgGDYHMwnZxF2x18m" + } + ], + "proofs": [], + "fee": 500000, + "type": 12, + "version": 2, + "chainId": 87 +} \ No newline at end of file From 0e99d6a329d1463dce0000805e9326ad65b9cd6c Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Mon, 3 Jul 2023 15:40:13 +0300 Subject: [PATCH 095/143] Changed PWR bonus to amount in Waves --- contracts/calculator/calculator.ride | 8 +-- contracts/calculator/test/_setup.js | 15 +++-- contracts/calculator/test/claim_waves.spec.js | 14 ++--- contracts/calculator/test/finalize.spec.js | 62 ++++++++++++------- contracts/factory/factory.ride | 4 +- 5 files changed, 61 insertions(+), 42 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 2cb9581..db51df2 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -151,7 +151,7 @@ func claimLP(userAddressBytes: ByteVector) = { func finalize( userAddressBytes: ByteVector, newTreasuryVolumeInWaves: Int, - pwrManagersBonus: Int, # 0..1×10⁸ + pwrManagersBonusInWaves: Int, treasuryVolumeDiffAllocationCoef: Int # -1..1×10⁸ ) = { strict checkCaller = i.onlyFactory() @@ -177,7 +177,7 @@ func finalize( i.originCaller == featureTreasuryAddressOrFail || throwErr("permission denied"), nextBlockToProcess > periodEndHeight || throwErr("unprocessed blocks"), newTreasuryVolumeInWaves >= 0 || throwErr("invalid new treasury volume"), - pwrManagersBonus >= 0 && pwrManagersBonus <= SCALE8 || throwErr("invalid PWR managers bonus"), + pwrManagersBonusInWaves >= 0 || throwErr("invalid PWR managers bonus"), treasuryVolumeDiffAllocationCoef >= -SCALE8 && treasuryVolumeDiffAllocationCoef <= SCALE8 || throwErr("invalid treasury volume diff allocation coefficient") ] @@ -191,8 +191,8 @@ func finalize( let currentTreasuryVolumeInWaves = donatedWavesAmount + investedWavesAmount let profitRaw = newTreasuryVolumeInWaves - currentTreasuryVolumeInWaves - let pwrManagersBonusAmount = if (profitRaw > 0) - then fraction(profitRaw, pwrManagersBonus, SCALE8) + let pwrManagersBonusAmount = if (profitRaw > 0 && pwrManagersBonusInWaves <= profitRaw) + then pwrManagersBonusInWaves else 0 let profit = profitRaw - pwrManagersBonusAmount let donationPart = if (currentTreasuryVolumeInWaves > 0) diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index c8d7098..d8f6875 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -9,7 +9,7 @@ import { format } from 'path' import { table, getBorderCharacters } from 'table' import { - chainId, broadcastAndWait, baseSeed, setScriptFromFile, daoAddress + chainId, broadcastAndWait, baseSeed, setScriptFromFile, daoAddress, daoSeed } from '../../../utils/api.js' const nonceLength = 3 @@ -24,7 +24,7 @@ export const setup = async ({ currentPeriod = 0, price = 100000000, period = 0, - investedXtnAmount = 0, + donatedWavesAmount = 0, investedWavesAmount = 0 } = {}) => { const nonce = wc.random(nonceLength, 'Buffer').toString('hex') @@ -90,6 +90,14 @@ export const setup = async ({ chainId }, accounts.calculator.seed)) + await broadcastAndWait(data({ + additionalFee: 4e5, + data: [ + { key: '%s__factory', type: 'string', value: accounts.factory.address } + ], + chainId + }, daoSeed)) + await broadcastAndWait(data({ additionalFee: 4e5, data: [ @@ -97,7 +105,6 @@ export const setup = async ({ { key: '%s__treasury', type: 'string', value: daoAddress() }, { key: '%s__featureTreasury', type: 'string', value: accounts.featureTreasury.address }, { key: '%s__lpAssetId', type: 'string', value: lpAssetId }, - { key: '%s__xtnAssetId', type: 'string', value: xtnAssetId }, { key: '%s__nextBlockToProcess', type: 'integer', value: nextBlockToProcess }, { key: '%s__currentPeriod', type: 'integer', value: currentPeriod }, { key: `%s%d__startHeight__${period}`, type: 'integer', value: nextBlockToProcess }, @@ -105,7 +112,7 @@ export const setup = async ({ { key: '%s__periodLength', type: 'integer', value: periodLength }, { key: '%s__blockProcessingReward', type: 'integer', value: blockProcessingReward }, { key: '%s%s__invested__WAVES', type: 'integer', value: investedWavesAmount }, - { key: `%s%s__invested__${xtnAssetId}`, type: 'integer', value: investedXtnAmount } + { key: '%s%s__donated__WAVES', type: 'integer', value: donatedWavesAmount } ], chainId }, accounts.factory.seed)) diff --git a/contracts/calculator/test/claim_waves.spec.js b/contracts/calculator/test/claim_waves.spec.js index c139cb5..7361c63 100644 --- a/contracts/calculator/test/claim_waves.spec.js +++ b/contracts/calculator/test/claim_waves.spec.js @@ -1,6 +1,6 @@ import chai from 'chai' import chaiAsPromised from 'chai-as-promised' -import { api, chainId, broadcastAndWait, daoSeed } from '../../../utils/api.js' +import { api, chainId, broadcastAndWait } from '../../../utils/api.js' import { setup } from './_setup.js' import { invokeScript } from '@waves/waves-transactions' @@ -47,9 +47,8 @@ describe(`[${process.pid}] calculator: claim waves`, () => { }, accounts.user1.seed)) const finalizePaymentAmount = 100e8 - const newTreasuryVolumeInWaves = 1000 * 1e8 - const xtnPrice = 0.05 * 1e8 - const pwrManagersBonus = 0.2 * 1e8 + const newTreasuryVolumeInWaves = 1100 * 1e8 + const pwrManagersBonusinWaves = 100 * 1e8 const treasuryVolumeDiffAllocationCoef = 0 const [{ quantity }] = await api.assets.fetchDetails([lpAssetId]) await broadcastAndWait(invokeScript({ @@ -58,15 +57,14 @@ describe(`[${process.pid}] calculator: claim waves`, () => { function: 'finalize', args: [ { type: 'integer', value: newTreasuryVolumeInWaves }, - { type: 'integer', value: xtnPrice }, - { type: 'integer', value: pwrManagersBonus }, + { type: 'integer', value: pwrManagersBonusinWaves }, { type: 'integer', value: treasuryVolumeDiffAllocationCoef } ] }, payment: [{ assetId: null, amount: finalizePaymentAmount }], chainId, additionalFee: 4e5 - }, daoSeed)) + }, accounts.featureTreasury.seed)) const { stateChanges } = await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, @@ -83,7 +81,7 @@ describe(`[${process.pid}] calculator: claim waves`, () => { const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') const profitRaw = newTreasuryVolumeInWaves - investedWavesAmount - const profit = profitRaw - profitRaw * pwrManagersBonus / scale8 + const profit = profitRaw - pwrManagersBonusinWaves const expectedPrice = Math.floor((investedWavesAmount + profit) * scale8 / quantity) expect(price).to.equal(expectedPrice) expect(transfer).to.deep.equal({ diff --git a/contracts/calculator/test/finalize.spec.js b/contracts/calculator/test/finalize.spec.js index 10182fe..3985c97 100644 --- a/contracts/calculator/test/finalize.spec.js +++ b/contracts/calculator/test/finalize.spec.js @@ -1,6 +1,6 @@ import chai from 'chai' import chaiAsPromised from 'chai-as-promised' -import { api, chainId, broadcastAndWait, daoSeed } from '../../../utils/api.js' +import { api, chainId, broadcastAndWait } from '../../../utils/api.js' import { setup } from './_setup.js' import { invokeScript } from '@waves/waves-transactions' @@ -12,34 +12,33 @@ const scale8 = 1e8 describe(`[${process.pid}] calculator: finalize`, () => { let accounts, lpAssetId const paymentAmount = 1 - const newTreasuryVolumeInWaves = 1000 * 1e8 - const xtnPrice = 0.05 * 1e8 - const pwrManagersBonus = 0.2 * 1e8 - const treasuryVolumeDiffAllocationCoef = 0 + const periodLength = 1 + const newTreasuryVolumeInWaves = 12345 * 1e8 + const pwrManagersBonusInWaves = 777 * 1e8 + const treasuryVolumeDiffAllocationCoef = -0.123456 + const initialInvestInWaves = 5678 * 1e8 + const initialDonatedInWaves = 3456 * 1e8 before(async () => { const { height } = await api.blocks.fetchHeight(); ({ accounts, lpAssetId } = await setup({ nextBlockToProcess: height, - periodLength: 1 + periodLength, + blockProcessingReward: 0, + investedWavesAmount: initialInvestInWaves, + donatedWavesAmount: initialDonatedInWaves })) }) it('only factory can call finalize', async () => { - const newTreasuryVolumeInWaves = 1000 * 1e8 - const xtnPrice = 0.05 * 1e8 - const pwrManagersBonus = 0.2 * 1e8 - const treasuryVolumeDiffAllocationCoef = 0 - return expect(broadcastAndWait(invokeScript({ dApp: accounts.factory.address, call: { function: 'finalize', args: [ { type: 'integer', value: newTreasuryVolumeInWaves }, - { type: 'integer', value: xtnPrice }, - { type: 'integer', value: pwrManagersBonus }, - { type: 'integer', value: treasuryVolumeDiffAllocationCoef } + { type: 'integer', value: pwrManagersBonusInWaves }, + { type: 'integer', value: treasuryVolumeDiffAllocationCoef * scale8 } ] }, payment: [], @@ -54,15 +53,14 @@ describe(`[${process.pid}] calculator: finalize`, () => { function: 'finalize', args: [ { type: 'integer', value: newTreasuryVolumeInWaves }, - { type: 'integer', value: xtnPrice }, - { type: 'integer', value: pwrManagersBonus }, - { type: 'integer', value: treasuryVolumeDiffAllocationCoef } + { type: 'integer', value: pwrManagersBonusInWaves }, + { type: 'integer', value: treasuryVolumeDiffAllocationCoef * scale8 } ] }, payment: [{ assetId: null, amount: paymentAmount }], chainId, additionalFee: 4e5 - }, daoSeed))).to.be.rejectedWith('unprocessed blocks') + }, accounts.featureTreasury.seed))).to.be.rejectedWith('unprocessed blocks') }) it('period should be finalized', async () => { @@ -80,22 +78,38 @@ describe(`[${process.pid}] calculator: finalize`, () => { function: 'finalize', args: [ { type: 'integer', value: newTreasuryVolumeInWaves }, - { type: 'integer', value: xtnPrice }, - { type: 'integer', value: pwrManagersBonus }, - { type: 'integer', value: treasuryVolumeDiffAllocationCoef } + { type: 'integer', value: pwrManagersBonusInWaves }, + { type: 'integer', value: treasuryVolumeDiffAllocationCoef * scale8 } ] }, payment: [{ assetId: null, amount: paymentAmount }], chainId, additionalFee: 4e5 - }, daoSeed)) + }, accounts.featureTreasury.seed)) const { balance: factoryBalanceAfter } = await api.addresses.fetchBalance(accounts.factory.address) const [{ quantity }] = await api.assets.fetchDetails([lpAssetId]) const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') - const profit = newTreasuryVolumeInWaves - const expectedPrice = Math.floor(profit * (scale8 - pwrManagersBonus) / quantity) + + const totalInitInvest = initialDonatedInWaves + initialInvestInWaves + const profitOrLoss = newTreasuryVolumeInWaves - totalInitInvest + const rawProfit = profitOrLoss - (pwrManagersBonusInWaves <= profitOrLoss ? pwrManagersBonusInWaves : 0) + + const donationPart = initialDonatedInWaves / totalInitInvest + const investPart = initialInvestInWaves / totalInitInvest + const donatedRawProfit = rawProfit * donationPart + const investRawProfit = rawProfit * investPart + let investProfit = investRawProfit + if (treasuryVolumeDiffAllocationCoef < 0) { + investProfit = investRawProfit * (1 - Math.abs(treasuryVolumeDiffAllocationCoef)) + } + if (treasuryVolumeDiffAllocationCoef > 0) { + investProfit = investRawProfit + donatedRawProfit * Math.abs(treasuryVolumeDiffAllocationCoef) + } + + const expectedPrice = Math.floor((initialInvestInWaves + investProfit) * scale8 / quantity) + console.log(price / scale8, expectedPrice / scale8) expect(price, 'invalid price').to.equal(expectedPrice) const expectedFactoryBalance = factoryBalanceBefore + paymentAmount expect(factoryBalanceAfter, 'invalid factory balance').to.equal(expectedFactoryBalance) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index ba3c87c..4144e87 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -144,7 +144,7 @@ func transferFromProxyTreasury(recipientBytes: ByteVector, rewardsAmount: Int) = @Callable(i) func finalize( newTreasuryVolumeInWaves: Int, - pwrManagersBonus: Int, + pwrManagersBonusInWaves: Int, treasuryVolumeDiffAllocationCoef: Int ) = { ( @@ -154,7 +154,7 @@ func finalize( [ i.caller.bytes, newTreasuryVolumeInWaves, - pwrManagersBonus, + pwrManagersBonusInWaves, treasuryVolumeDiffAllocationCoef ], i.payments From dd11787e8f98c88631cfbed5cf35c49b6894268b Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Mon, 3 Jul 2023 16:05:20 +0300 Subject: [PATCH 096/143] Added featureTreasury disctribution test --- contracts/calculator/test/process_blocks.spec.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/contracts/calculator/test/process_blocks.spec.js b/contracts/calculator/test/process_blocks.spec.js index a71acf0..2b21b82 100644 --- a/contracts/calculator/test/process_blocks.spec.js +++ b/contracts/calculator/test/process_blocks.spec.js @@ -41,5 +41,11 @@ describe(`[${process.pid}] calculator: process blocks`, () => { const daoBlockReward = 2e8 const expectedBalance = daoBlockReward * periodLength - blockProcessingReward expect(balance).to.equal(expectedBalance) + + const { balance: featureTreasuryBalance } = await api.addresses.fetchBalance(accounts.featureTreasury.address) + const blockReward = 2e8 + const setupBalance = 100e8 // Waves amount from setup + const expectedFeatureTreasuryBalance = blockReward * periodLength - blockProcessingReward + setupBalance + expect(featureTreasuryBalance).to.be.eql(expectedFeatureTreasuryBalance) }) }) From decac5a070bd3cf5b3d59d7d11644753f6f39668 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Mon, 3 Jul 2023 18:17:18 +0300 Subject: [PATCH 097/143] Renamed treasury variables and keys --- contracts/calculator/calculator.ride | 18 +++++++++--------- contracts/factory/factory.ride | 8 ++++---- .../{treasury.ride => proxy_treasury.ride} | 2 +- contracts/treasury/test/_setup.js | 2 +- migrations/calculator_set_factory.json | 2 +- migrations/factory_init.json | 11 ++++++++--- migrations/issue.json | 2 +- migrations/proxy_treasury_set_factory.json | 2 +- 8 files changed, 26 insertions(+), 21 deletions(-) rename contracts/treasury/{treasury.ride => proxy_treasury.ride} (99%) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index db51df2..afdac53 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -31,8 +31,8 @@ func abs(n: Int) = { func keyFactoryAddress() = ["%s", "factory"].makeString(SEP) func keyLpAssetId() = ["%s", "lpAssetId"].makeString(SEP) -func keyTreasuryAddress() = ["%s", "treasury"].makeString(SEP) -func keyFeatureTreasuryAddress() = ["%s", "featureTreasury"].makeString(SEP) +func keyProxyTreasuryAddress() = ["%s", "proxyTreasury"].makeString(SEP) +func keyMainTreasuryAddress() = ["%s", "mainTreasury"].makeString(SEP) func keyInvested(assetId: ByteVector|Unit) = ["%s%s", "invested", assetIdToString(assetId)].makeString(SEP) func keyDonated(assetId: ByteVector|Unit) = ["%s%s", "donated", assetIdToString(assetId)].makeString(SEP) func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toString()].makeString(SEP) @@ -82,17 +82,17 @@ let lpAssetIdOption = match factoryAddressOption { } let lpAssetIdOrFail = lpAssetIdOption.valueOrErrorMessage(wrapErr("invalid lpAssetId")) -let treasuryAddressOption = match factoryAddressOption { - case a: Address => match a.getString(keyTreasuryAddress()) { +let proxyTreasuryAddressOption = match factoryAddressOption { + case a: Address => match a.getString(keyProxyTreasuryAddress()) { case s: String => s.addressFromString() case _: Unit => unit } case _: Unit => unit } -let treasuryAddressOrFail = treasuryAddressOption.valueOrErrorMessage(wrapErr("invalid proxy treasury address")) +let proxyTreasuryAddressOrFail = proxyTreasuryAddressOption.valueOrErrorMessage(wrapErr("invalid proxy treasury address")) let featureTreasuryAddressOption = match factoryAddressOption { - case a: Address => match a.getString(keyFeatureTreasuryAddress()) { + case a: Address => match a.getString(keyMainTreasuryAddress()) { case s: String => s.addressFromString() case _: Unit => unit } @@ -433,7 +433,7 @@ func processBlocks(userAddressBytes: ByteVector) = { } else { let targetBlockHeight = nextBlockToProcess + inc let targetBlockInfo = blockInfoByHeight(targetBlockHeight).valueOrErrorMessage(wrapErr("invalid block info")) - let treasuryRewardOrFail = rewardForOption(targetBlockInfo.rewards, treasuryAddressOrFail) + let treasuryRewardOrFail = rewardForOption(targetBlockInfo.rewards, proxyTreasuryAddressOrFail) .valueOrErrorMessage(wrapErr("invalid treasury reward for height " + targetBlockHeight.toString())) let generator = targetBlockInfo.generator let available = factoryAddressOrFail.getInteger(keyAvailable(generator)).valueOrElse(0) @@ -479,7 +479,7 @@ func processBlocks(userAddressBytes: ByteVector) = { ] strict (lpAssetAmountTotal, rewardAmountTotal) = FOLD<40>(list, (0, 0), map) - let rewardToFeatureTreasuryAmount = rewardAmountTotal - blockProcessingReward + let rewardToMainTreasuryAmount = rewardAmountTotal - blockProcessingReward strict actions = [ factoryAddressOrFail.invoke("transferWaves", [ @@ -494,7 +494,7 @@ func processBlocks(userAddressBytes: ByteVector) = { ], []), factoryAddressOrFail.invoke("transferFromProxyTreasury", [ featureTreasuryAddressOrFail.bytes, - rewardToFeatureTreasuryAmount + rewardToMainTreasuryAmount ], []), factoryAddressOrFail.invoke("transferFromProxyTreasury", [ factoryAddressOrFail.bytes, diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 4144e87..eea044d 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -14,7 +14,7 @@ func throwErr(s: String) = { } func keyCalculatorAddress() = "%s__calculator" -func keyTreasuryAddress() = "%s__treasury" # 3PEgG7eZHLFhcfsTSaYxgRhZsh4AxMvA4Ms +func keyProxyTreasuryAddress() = "%s__proxyTreasury" # 3PEgG7eZHLFhcfsTSaYxgRhZsh4AxMvA4Ms func keyChildAddress() = "%s__child" # 3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h # 0.005 waves to compensate the cost of the transaction func keyBlockProcessingReward() = "%s__blockProcessingReward" @@ -29,11 +29,11 @@ let calculatorAddressOption = match this.getString(keyCalculatorAddress()) { } let calculatorAddressOrFail = calculatorAddressOption.valueOrErrorMessage(wrapErr("invalid calculator address")) -let treasuryAddressOption = match this.getString(keyTreasuryAddress()) { +let proxyTreasuryAddressOption = match this.getString(keyProxyTreasuryAddress()) { case s: String => s.addressFromString() case _: Unit => unit } -let treasuryAddressOrFail = treasuryAddressOption.valueOrErrorMessage(wrapErr("invalid proxy treasury address")) +let proxyTreasuryAddressOrFail = proxyTreasuryAddressOption.valueOrErrorMessage(wrapErr("invalid proxy treasury address")) func keyConfigAddress() = "%s__config" @@ -138,7 +138,7 @@ func transferWaves(recepientBytes: ByteVector, amount: Int) = @Callable(i) func transferFromProxyTreasury(recipientBytes: ByteVector, rewardsAmount: Int) = - if (i.onlyCalculator()) then (nil, treasuryAddressOrFail.invoke("transferWaves", [recipientBytes, rewardsAmount], [])) else ([], unit) + if (i.onlyCalculator()) then (nil, proxyTreasuryAddressOrFail.invoke("transferWaves", [recipientBytes, rewardsAmount], [])) else ([], unit) # finalize period @Callable(i) diff --git a/contracts/treasury/treasury.ride b/contracts/treasury/proxy_treasury.ride similarity index 99% rename from contracts/treasury/treasury.ride rename to contracts/treasury/proxy_treasury.ride index cd1332f..7aa0393 100644 --- a/contracts/treasury/treasury.ride +++ b/contracts/treasury/proxy_treasury.ride @@ -3,7 +3,7 @@ {-# SCRIPT_TYPE ACCOUNT #-} let SEP = "__" -let contractFilename = "treasury.ride" +let contractFilename = "proxy_treasury.ride" let ADMIN_LIST_SIZE = 5 let QUORUM = 3 let TXID_BYTES_LENGTH = 32 diff --git a/contracts/treasury/test/_setup.js b/contracts/treasury/test/_setup.js index 5bbc6b4..fdaa009 100644 --- a/contracts/treasury/test/_setup.js +++ b/contracts/treasury/test/_setup.js @@ -12,7 +12,7 @@ import { const nonceLength = 3 const ridePath = 'contracts/treasury' -const treasuryPath = format({ dir: ridePath, base: 'treasury.ride' }) +const treasuryPath = format({ dir: ridePath, base: 'proxy_treasury.ride' }) export const setupAccounts = async () => { const nonce = wc.random(nonceLength, 'Buffer').toString('hex') diff --git a/migrations/calculator_set_factory.json b/migrations/calculator_set_factory.json index 741d68c..c3128e1 100644 --- a/migrations/calculator_set_factory.json +++ b/migrations/calculator_set_factory.json @@ -12,4 +12,4 @@ "type": 12, "version": 2, "chainId": 87 -} \ No newline at end of file +} diff --git a/migrations/factory_init.json b/migrations/factory_init.json index 0f835df..d673783 100644 --- a/migrations/factory_init.json +++ b/migrations/factory_init.json @@ -12,14 +12,19 @@ "value": "3PGWhtvCSz1TRJhe3BJSrvQigrtKuyXsgma" }, { - "key": "%s__treasury", + "key": "%s__proxyTreasury", "type": "string", "value": "3PEgG7eZHLFhcfsTSaYxgRhZsh4AxMvA4Ms" }, + { + "key": "%s__mainTreasury", + "type": "string", + "value": "3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h" + }, { "key": "%s__featureTreasury", "type": "string", - "value": "" + "value": "3P7XaCYwKR7x4jLsZ4GwXK3PJZciYuX5DqA" }, { "key": "%s__lpAssetId", @@ -257,4 +262,4 @@ "type": 12, "version": 2, "chainId": 87 -} \ No newline at end of file +} diff --git a/migrations/issue.json b/migrations/issue.json index c3d2e09..400486f 100644 --- a/migrations/issue.json +++ b/migrations/issue.json @@ -10,4 +10,4 @@ "reissuable": true, "chainId": 87, "proofs": [] -} \ No newline at end of file +} diff --git a/migrations/proxy_treasury_set_factory.json b/migrations/proxy_treasury_set_factory.json index a4ede2a..18b701a 100644 --- a/migrations/proxy_treasury_set_factory.json +++ b/migrations/proxy_treasury_set_factory.json @@ -12,4 +12,4 @@ "type": 12, "version": 2, "chainId": 87 -} \ No newline at end of file +} From 1697ebdbdad4c54068b7b70ce61b0be393d13c5f Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 4 Jul 2023 09:46:08 +0300 Subject: [PATCH 098/143] Fixed LP double burn --- contracts/calculator/calculator.ride | 2 -- 1 file changed, 2 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index afdac53..2b3230f 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -5,7 +5,6 @@ let SEP = "__" let CONTRACT_NAME = "calculator.ride" let SCALE8 = 100_000_000 -let SCALE6 = 1_000_000 let PENDING = "PENDING" let FINISHED = "FINISHED" let WAVES = "WAVES" @@ -380,7 +379,6 @@ func claimWaves(userAddressBytes: ByteVector, txId: ByteVector) = { keyWithdrawalRequest(userAddress, txId), valueWithdrawalRequest(FINISHED, lpAssetAmount, targetPeriod, i.transactionId) ], []), - factoryAddressOrFail.invoke("burn", [lpAssetAmount], []), factoryAddressOrFail.invoke("transferWaves", [userAddressBytes, amount], []) ] (nil, factoryActions) From a645d60a34ccc7d59f0cdec1bf4e735f12b6e478 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 4 Jul 2023 09:47:27 +0300 Subject: [PATCH 099/143] Removed XTN usage --- contracts/calculator/test/_setup.js | 11 +---------- contracts/factory/factory.md | 6 ++++-- migrations/factory_init.json | 7 +------ 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index d8f6875..70f687d 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -65,15 +65,6 @@ export const setup = async ({ chainId }, accounts.factory.seed)) - const { id: xtnAssetId } = await broadcastAndWait(issue({ - name: 'XTN.', - description: '', - quantity: 1, - decimals: 6, - reissuable: true, - chainId - }, baseSeed)) - if (lpAssetAmountToIssueRaw === 0) { await broadcastAndWait(burn({ assetId: lpAssetId, @@ -120,5 +111,5 @@ export const setup = async ({ await setScriptFromFile(calculatorPath, accounts.calculator.seed) await setScriptFromFile(factoryPath, accounts.factory.seed) - return { accounts, lpAssetId, xtnAssetId, periodLength, blockProcessingReward, price } + return { accounts, lpAssetId, periodLength, blockProcessingReward, price } } diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index 68c25f1..e3fca85 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -3,12 +3,14 @@ | key | type | | :---------------------------- | :------- | | `%s__calculator` | `String` | -| `%s__treasury` | `String` | +| `%s__proxyTreasury` | `String` | +| `%s__mainTreasury` | `String` | | `%s__config` | `String` | | `%s__lpAssetId` | `String` | -| `%s__xtnAssetId` | `String` | | `%s__currentPeriod` | `Int` | | `%s__periodLength` | `Int` | +| `%s%s__invested__WAVES` | `Int` | +| `%s%s__donated__WAVES` | `Int` | | `%s%d__startHeight__` | `Int` | | `%s%d__price__` | `Int` | | `%s__nextBlockToProcess` | `Int` | diff --git a/migrations/factory_init.json b/migrations/factory_init.json index d673783..8435d96 100644 --- a/migrations/factory_init.json +++ b/migrations/factory_init.json @@ -31,11 +31,6 @@ "type": "string", "value": "HYogWffUjS8Uw4bYA1Dn3qrGmJerMqkf139aJcHhk8yq" }, - { - "key": "%s__xtnAssetId", - "type": "string", - "value": "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" - }, { "key": "%s__currentPeriod", "type": "integer", @@ -69,7 +64,7 @@ { "key": "%s%s__donated__WAVES", "type": "integer", - "value": 0 + "value": 65116200000000 }, { "key": "%s%s__available__3P2EDoG2nxrXGwcGT8RkGhWJje61ZMCuXr3", From a1d403b86ae985f747f7abed00845b6e73c94fa4 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 4 Jul 2023 10:33:58 +0300 Subject: [PATCH 100/143] Redundant transfer removed --- contracts/calculator/calculator.ride | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 2b3230f..2ca526d 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -480,9 +480,6 @@ func processBlocks(userAddressBytes: ByteVector) = { let rewardToMainTreasuryAmount = rewardAmountTotal - blockProcessingReward strict actions = [ - factoryAddressOrFail.invoke("transferWaves", [ - userAddressBytes, blockProcessingReward - ], []), factoryAddressOrFail.invoke("reissue", [ lpAssetAmountTotal ], []), @@ -495,7 +492,7 @@ func processBlocks(userAddressBytes: ByteVector) = { rewardToMainTreasuryAmount ], []), factoryAddressOrFail.invoke("transferFromProxyTreasury", [ - factoryAddressOrFail.bytes, + userAddressBytes, blockProcessingReward ], []) ] From aeb08685dd06b564ddfefac20e61e2a43792bbaa Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 4 Jul 2023 11:29:52 +0300 Subject: [PATCH 101/143] Fixed invested amount calculation Updated tests --- contracts/calculator/calculator.ride | 11 +++++++- contracts/calculator/test/_setup.js | 6 ++--- contracts/calculator/test/claim_waves.spec.js | 2 +- contracts/calculator/test/finalize.spec.js | 27 +++++++++++-------- .../calculator/test/process_blocks.spec.js | 2 +- 5 files changed, 31 insertions(+), 17 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 2ca526d..412e785 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -221,6 +221,8 @@ func finalize( let newPrice = fraction(investedWavesAmountNew, SCALE8, lpAssetQuantity) let lpAssetAmountToBurn = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) + let newLpAmount = lpAssetQuantity - lpAssetAmountToBurn + let newInvestAmount = max([0, fraction(newLpAmount, newPrice, SCALE8)]) let paymentAmountMin = max([0, fraction(lpAssetAmountToBurn, newPrice, SCALE8)]) let paymentOption = if (i.payments.size() > 0) then i.payments[0] else unit let paymentAmount = paymentOption.value().amount @@ -246,7 +248,9 @@ func finalize( factoryAddressOrFail.invoke("integerEntry", [keyStartHeight(newPeriod), periodEndHeight + 1], []), # burn total withdrawal amount factoryAddressOrFail.invoke("burn", [lpAssetAmountToBurn], []), - factoryAddressOrFail.invoke("integerEntry", [keyWithdrawal(), 0], []) + factoryAddressOrFail.invoke("integerEntry", [keyWithdrawal(), 0], []), + # Calc new invested amount + factoryAddressOrFail.invoke("integerEntry", [keyInvested(unit), newInvestAmount], []) ] (actions, factoryActions) @@ -478,6 +482,7 @@ func processBlocks(userAddressBytes: ByteVector) = { strict (lpAssetAmountTotal, rewardAmountTotal) = FOLD<40>(list, (0, 0), map) let rewardToMainTreasuryAmount = rewardAmountTotal - blockProcessingReward + let invested = factoryAddressOrFail.getInteger(keyInvested(unit)).valueOrElse(0) strict actions = [ factoryAddressOrFail.invoke("reissue", [ @@ -494,6 +499,10 @@ func processBlocks(userAddressBytes: ByteVector) = { factoryAddressOrFail.invoke("transferFromProxyTreasury", [ userAddressBytes, blockProcessingReward + ], []), + # increase invested amount + factoryAddressOrFail.invoke("integerEntry", [ + keyInvested(unit), invested + rewardToMainTreasuryAmount ], []) ] diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index 70f687d..785759d 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -32,7 +32,7 @@ export const setup = async ({ 'factory', 'calculator', 'treasury', - 'featureTreasury', + 'mainTreasury', 'user1' ] const accounts = Object.fromEntries(names.map((item) => { @@ -93,8 +93,8 @@ export const setup = async ({ additionalFee: 4e5, data: [ { key: '%s__calculator', type: 'string', value: accounts.calculator.address }, - { key: '%s__treasury', type: 'string', value: daoAddress() }, - { key: '%s__featureTreasury', type: 'string', value: accounts.featureTreasury.address }, + { key: '%s__proxyTreasury', type: 'string', value: daoAddress() }, + { key: '%s__mainTreasury', type: 'string', value: accounts.mainTreasury.address }, { key: '%s__lpAssetId', type: 'string', value: lpAssetId }, { key: '%s__nextBlockToProcess', type: 'integer', value: nextBlockToProcess }, { key: '%s__currentPeriod', type: 'integer', value: currentPeriod }, diff --git a/contracts/calculator/test/claim_waves.spec.js b/contracts/calculator/test/claim_waves.spec.js index 7361c63..18cca08 100644 --- a/contracts/calculator/test/claim_waves.spec.js +++ b/contracts/calculator/test/claim_waves.spec.js @@ -64,7 +64,7 @@ describe(`[${process.pid}] calculator: claim waves`, () => { payment: [{ assetId: null, amount: finalizePaymentAmount }], chainId, additionalFee: 4e5 - }, accounts.featureTreasury.seed)) + }, accounts.mainTreasury.seed)) const { stateChanges } = await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, diff --git a/contracts/calculator/test/finalize.spec.js b/contracts/calculator/test/finalize.spec.js index 3985c97..325f574 100644 --- a/contracts/calculator/test/finalize.spec.js +++ b/contracts/calculator/test/finalize.spec.js @@ -13,18 +13,20 @@ describe(`[${process.pid}] calculator: finalize`, () => { let accounts, lpAssetId const paymentAmount = 1 const periodLength = 1 - const newTreasuryVolumeInWaves = 12345 * 1e8 + const periodReward = 2 * 1e8 + const newTreasuryVolumeInWaves = 6789 * 1e8 const pwrManagersBonusInWaves = 777 * 1e8 const treasuryVolumeDiffAllocationCoef = -0.123456 const initialInvestInWaves = 5678 * 1e8 const initialDonatedInWaves = 3456 * 1e8 + const blockProcessingReward = 0.005 * 1e8 before(async () => { const { height } = await api.blocks.fetchHeight(); ({ accounts, lpAssetId } = await setup({ nextBlockToProcess: height, periodLength, - blockProcessingReward: 0, + blockProcessingReward, investedWavesAmount: initialInvestInWaves, donatedWavesAmount: initialDonatedInWaves })) @@ -60,7 +62,7 @@ describe(`[${process.pid}] calculator: finalize`, () => { payment: [{ assetId: null, amount: paymentAmount }], chainId, additionalFee: 4e5 - }, accounts.featureTreasury.seed))).to.be.rejectedWith('unprocessed blocks') + }, accounts.mainTreasury.seed))).to.be.rejectedWith('unprocessed blocks') }) it('period should be finalized', async () => { @@ -85,21 +87,23 @@ describe(`[${process.pid}] calculator: finalize`, () => { payment: [{ assetId: null, amount: paymentAmount }], chainId, additionalFee: 4e5 - }, accounts.featureTreasury.seed)) + }, accounts.mainTreasury.seed)) const { balance: factoryBalanceAfter } = await api.addresses.fetchBalance(accounts.factory.address) const [{ quantity }] = await api.assets.fetchDetails([lpAssetId]) const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') - const totalInitInvest = initialDonatedInWaves + initialInvestInWaves - const profitOrLoss = newTreasuryVolumeInWaves - totalInitInvest + const totalReward = periodLength * periodReward - blockProcessingReward + const totalInvestAmount = initialInvestInWaves + totalReward + const totalInvestAndDonation = initialDonatedInWaves + totalInvestAmount + const profitOrLoss = newTreasuryVolumeInWaves - totalInvestAndDonation const rawProfit = profitOrLoss - (pwrManagersBonusInWaves <= profitOrLoss ? pwrManagersBonusInWaves : 0) - const donationPart = initialDonatedInWaves / totalInitInvest - const investPart = initialInvestInWaves / totalInitInvest - const donatedRawProfit = rawProfit * donationPart - const investRawProfit = rawProfit * investPart + const donationPart = initialDonatedInWaves / totalInvestAndDonation + const investPart = totalInvestAmount / totalInvestAndDonation + const donatedRawProfit = Math.floor(rawProfit * donationPart) + const investRawProfit = Math.floor(rawProfit * investPart) let investProfit = investRawProfit if (treasuryVolumeDiffAllocationCoef < 0) { investProfit = investRawProfit * (1 - Math.abs(treasuryVolumeDiffAllocationCoef)) @@ -108,7 +112,8 @@ describe(`[${process.pid}] calculator: finalize`, () => { investProfit = investRawProfit + donatedRawProfit * Math.abs(treasuryVolumeDiffAllocationCoef) } - const expectedPrice = Math.floor((initialInvestInWaves + investProfit) * scale8 / quantity) + investProfit = Math.floor(investProfit) + const expectedPrice = Math.floor((totalInvestAmount + investProfit) * scale8 / quantity) console.log(price / scale8, expectedPrice / scale8) expect(price, 'invalid price').to.equal(expectedPrice) const expectedFactoryBalance = factoryBalanceBefore + paymentAmount diff --git a/contracts/calculator/test/process_blocks.spec.js b/contracts/calculator/test/process_blocks.spec.js index 2b21b82..fcf8295 100644 --- a/contracts/calculator/test/process_blocks.spec.js +++ b/contracts/calculator/test/process_blocks.spec.js @@ -42,7 +42,7 @@ describe(`[${process.pid}] calculator: process blocks`, () => { const expectedBalance = daoBlockReward * periodLength - blockProcessingReward expect(balance).to.equal(expectedBalance) - const { balance: featureTreasuryBalance } = await api.addresses.fetchBalance(accounts.featureTreasury.address) + const { balance: featureTreasuryBalance } = await api.addresses.fetchBalance(accounts.mainTreasury.address) const blockReward = 2e8 const setupBalance = 100e8 // Waves amount from setup const expectedFeatureTreasuryBalance = blockReward * periodLength - blockProcessingReward + setupBalance From 62d67c77e20ba91f7c859073a0dc791da72df650 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 4 Jul 2023 13:46:44 +0300 Subject: [PATCH 102/143] Update tests --- contracts/calculator/test/finalize.spec.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/contracts/calculator/test/finalize.spec.js b/contracts/calculator/test/finalize.spec.js index 325f574..0666afb 100644 --- a/contracts/calculator/test/finalize.spec.js +++ b/contracts/calculator/test/finalize.spec.js @@ -14,12 +14,12 @@ describe(`[${process.pid}] calculator: finalize`, () => { const paymentAmount = 1 const periodLength = 1 const periodReward = 2 * 1e8 - const newTreasuryVolumeInWaves = 6789 * 1e8 - const pwrManagersBonusInWaves = 777 * 1e8 - const treasuryVolumeDiffAllocationCoef = -0.123456 - const initialInvestInWaves = 5678 * 1e8 - const initialDonatedInWaves = 3456 * 1e8 - const blockProcessingReward = 0.005 * 1e8 + const newTreasuryVolumeInWaves = 10000 * 1e8 + const pwrManagersBonusInWaves = 700 * 1e8 + const treasuryVolumeDiffAllocationCoef = -0.5 + const initialInvestInWaves = 5000 * 1e8 + const initialDonatedInWaves = 3000 * 1e8 + const blockProcessingReward = 0.015 * 1e8 before(async () => { const { height } = await api.blocks.fetchHeight(); @@ -102,8 +102,8 @@ describe(`[${process.pid}] calculator: finalize`, () => { const donationPart = initialDonatedInWaves / totalInvestAndDonation const investPart = totalInvestAmount / totalInvestAndDonation - const donatedRawProfit = Math.floor(rawProfit * donationPart) - const investRawProfit = Math.floor(rawProfit * investPart) + const donatedRawProfit = rawProfit * donationPart + const investRawProfit = rawProfit * investPart let investProfit = investRawProfit if (treasuryVolumeDiffAllocationCoef < 0) { investProfit = investRawProfit * (1 - Math.abs(treasuryVolumeDiffAllocationCoef)) @@ -112,7 +112,6 @@ describe(`[${process.pid}] calculator: finalize`, () => { investProfit = investRawProfit + donatedRawProfit * Math.abs(treasuryVolumeDiffAllocationCoef) } - investProfit = Math.floor(investProfit) const expectedPrice = Math.floor((totalInvestAmount + investProfit) * scale8 / quantity) console.log(price / scale8, expectedPrice / scale8) expect(price, 'invalid price').to.equal(expectedPrice) From ad398ab065d080e408e076d3c262403ceaaf19e5 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 4 Jul 2023 17:23:32 +0300 Subject: [PATCH 103/143] Changed verifiers Calculator and Proxy Treasury managed by Manager MultiSig and Proposal Voting moved to Factory Added block process reward amount to Init Data TX --- contracts/calculator/calculator.ride | 20 +++- contracts/factory/factory.ride | 128 +++++++++++++++++++++- contracts/treasury/proxy_treasury.ride | 143 +++---------------------- migrations/factory_init.json | 5 + 4 files changed, 164 insertions(+), 132 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 412e785..25beac2 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -29,6 +29,7 @@ func abs(n: Int) = { } func keyFactoryAddress() = ["%s", "factory"].makeString(SEP) +func keyManagerPublicKey() = ["%s", "managerPublicKey"].makeString(SEP) func keyLpAssetId() = ["%s", "lpAssetId"].makeString(SEP) func keyProxyTreasuryAddress() = ["%s", "proxyTreasury"].makeString(SEP) func keyMainTreasuryAddress() = ["%s", "mainTreasury"].makeString(SEP) @@ -99,6 +100,18 @@ let featureTreasuryAddressOption = match factoryAddressOption { } let featureTreasuryAddressOrFail = featureTreasuryAddressOption.valueOrErrorMessage(wrapErr("invalid feature treasury address")) +func getManagerPublicKeyOrUnit() = { + match (factoryAddressOption) { + case fa:Address => { + match (fa.getString(keyManagerPublicKey())) { + case pub:String => pub.fromBase58String() + case _ => unit + } + } + case _ => unit + } +} + func onlyAddress(i: Invocation, address: Address) = { i.caller == address || throwErr("permission denied") } @@ -511,5 +524,10 @@ func processBlocks(userAddressBytes: ByteVector) = { @Verifier(tx) func verify() = { - sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) + let publicKey = match (getManagerPublicKeyOrUnit()) { + case pub:ByteVector => pub + case _ => tx.senderPublicKey + } + + sigVerify(tx.bodyBytes, tx.proofs[0], publicKey) } diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index eea044d..429a3b6 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -13,6 +13,93 @@ func throwErr(s: String) = { throw(wrapErr(s)) } +###################### +# MULTISIG FUNCTIONS # +###################### +let ADMIN_LIST_SIZE = 5 +let QUORUM = 3 +let TXID_BYTES_LENGTH = 32 + +func keyAllowedTxIdVotePrefix(txId: String) = makeString(["%s%s%s", "allowTxId", txId], SEP) +# Make Admin vote key +func keyFullAdminVote(prefix: String, adminAddress: String) = makeString([prefix, adminAddress], SEP) +# Admin List key +func keyAdminAddressList() = makeString(["%s", "adminAddressList"], SEP) +# Allowed TXID key +func keyAllowedTxId() = makeString(["%s", "txId"], SEP) + +func getAdminVote(prefix: String, admin: String) = { + let voteKey = keyFullAdminVote(prefix, admin) + getInteger(voteKey).valueOrElse(0) +} + +func getAdminsList() = { + match (this.getString(keyAdminAddressList())) { + case s:String => s.split(SEP) + case _ => [] + } +} + +func isInAdminList(address: String) = { + getAdminsList().containsElement(address) +} + +# Generate List of keys with same prefix for all admins +func genVotesKeysHelper(a: (List[String], String), adminAddress: String) = { + let (result, prefix) = a + (result :+ keyFullAdminVote(prefix, adminAddress), prefix) +} +func genVotesKeys(keyPrefix: String) = { + let adminList = keyAdminAddressList() + let (result, prefix) = FOLD<5>(getAdminsList(), ([], keyPrefix), genVotesKeysHelper) + result +} + +# Count all votes for Prefix +func countVotesHelper(result: Int, voteKey: String) = { + result + getInteger(voteKey).valueOrElse(0) +} +func countVotes(prefix: String) = { + let votes = genVotesKeys(prefix) + FOLD<5>(votes, 0, countVotesHelper) +} + +# Generate DeleteEntry for all votes with Prefix +func clearVotesHelper(result: List[DeleteEntry], key: String) = { + result :+ DeleteEntry(key) +} +func getClearVoteEntries(prefix: String) = { + let votes = genVotesKeys(prefix) + FOLD<5>(votes, [], clearVotesHelper) +} + +func voteINTERNAL( + callerAddressString: String, + keyPrefix: String, + minVotes: Int, + voteResult: List[StringEntry|IntegerEntry|DeleteEntry] +) = { + let voteKey = keyFullAdminVote(keyPrefix, callerAddressString) + let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString) + + strict err = if (!isInAdminList(callerAddressString)) then { + throwErr("Address: " + callerAddressString + " not in Admin list") + } else if (adminCurrentVote == 1) then { + throwErr(voteKey + " you already voted") + } else { unit } + + let votes = countVotes(keyPrefix) + if (votes + 1 >= minVotes) then { + let clearVoteEntries = getClearVoteEntries(keyPrefix) + clearVoteEntries ++ voteResult + } else { + [ IntegerEntry(voteKey, 1) ] + } +} +########################## +# MULTISIG FUNCTIONS END # +########################## + func keyCalculatorAddress() = "%s__calculator" func keyProxyTreasuryAddress() = "%s__proxyTreasury" # 3PEgG7eZHLFhcfsTSaYxgRhZsh4AxMvA4Ms func keyChildAddress() = "%s__child" # 3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h @@ -186,11 +273,42 @@ func cancelWithdraw(txIdStr: String) = @Callable(i) func processBlocks() = (nil, calculatorAddressOrFail.reentrantInvoke("processBlocks", [i.caller.bytes], i.payments)) +##################### +# MUTISIG FUNCTIONS # +##################### +# Vote for txId that is allowed in Verifier +@Callable(i) +func voteForTxId(txId: String) = { + let callerAddressString = toBase58String(i.caller.bytes) + let keyPrefix = keyAllowedTxIdVotePrefix(txId) + let result = [ StringEntry(keyAllowedTxId(), txId) ] + let allowedTxIdOption = this.getString(keyAllowedTxId()) + + strict err = [ + txId.fromBase58String().size() == TXID_BYTES_LENGTH || throwErr(txId + " is not valid txId"), + allowedTxIdOption == unit || allowedTxIdOption.value() != txId || throwErr(txId + " is already allowed") + ] + + voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result) +} +######################### +# MUTISIG FUNCTIONS END # +######################### + @Verifier(tx) func verify() = { - let byProposal = votingResultAddressOrFail.getBoolean(keyProposalAllowBroadcast(this, tx.id)).valueOrElse(false) - let byOwner = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) - if (votingResultAddressOption != unit) then { - byProposal || byOwner - } else byOwner + let byProposal = { + match (votingResultAddressOption) { + case proposalAddress:Address => proposalAddress.getBoolean(keyProposalAllowBroadcast(this, tx.id)).valueOrElse(false) + case _ => false + } + } + let byAdmins = (tx.id == this.getString(keyAllowedTxId()).valueOrElse("").fromBase58String()) + let byOwner = (if (getAdminsList().size() >= QUORUM) then { + false + } else { + sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) + }) + + byProposal || byAdmins || byOwner } diff --git a/contracts/treasury/proxy_treasury.ride b/contracts/treasury/proxy_treasury.ride index 7aa0393..047d31f 100644 --- a/contracts/treasury/proxy_treasury.ride +++ b/contracts/treasury/proxy_treasury.ride @@ -4,9 +4,6 @@ let SEP = "__" let contractFilename = "proxy_treasury.ride" -let ADMIN_LIST_SIZE = 5 -let QUORUM = 3 -let TXID_BYTES_LENGTH = 32 func wrapErr(s: String) = { contractFilename + ": " + s @@ -16,30 +13,8 @@ func throwErr(s: String) = { throw(wrapErr(s)) } -func keyAllowedTxIdVotePrefix(txId: String) = makeString(["%s%s%s", "allowTxId", txId], SEP) - -# Make Admin vote key -func keyFullAdminVote(prefix: String, adminAddress: String) = makeString([prefix, adminAddress], SEP) - -# Admin List key -func keyAdminAddressList() = makeString(["%s", "adminAddressList"], SEP) - -# Factory address key func keyFactoryAddress() = makeString(["%s", "factory"], SEP) - -# Allowed TXID key -func keyAllowedTxId() = makeString(["%s", "txId"], SEP) - -func keyConfigAddress() = "%s__config" -func keyVotingResultAddress() = "contract_voting_result" -func keyProposalAllowBroadcast(address: Address, txId: ByteVector) = { - "proposal_allow_broadcast_" + address.toString() + "_" + txId.toBase58String() -} -let configAddressOption = match this.getString(keyConfigAddress()) { - case s: String => s.addressFromString() - case _: Unit => unit -} -let configAddress = configAddressOption.valueOrErrorMessage(wrapErr("invalid config address")) +func keyManagerPublicKey() = makeString(["%s", "managerPublicKey"], SEP) let factoryAddressOption = match this.getString(keyFactoryAddress()) { case s: String => s.addressFromString() @@ -47,15 +22,6 @@ let factoryAddressOption = match this.getString(keyFactoryAddress()) { } let factoryAddressOrFail = factoryAddressOption.valueOrErrorMessage(wrapErr("invalid factory address")) -let votingResultContractOption = match configAddressOption { - case a: Address => match a.getString(keyVotingResultAddress()) { - case s: String => s.addressFromString() - case _: Unit => unit - } - case _: Unit => unit -} -let votingResultContract = votingResultContractOption.valueOrErrorMessage(wrapErr("invalid voting result address")) - func onlyAddress(i: Invocation, address: Address) = { i.caller == address || throwErr("permission denied") } @@ -64,73 +30,16 @@ func onlyFactory(i: Invocation) = { onlyAddress(i, factoryAddressOrFail) } -func getAdminVote(prefix: String, admin: String) = { - let voteKey = keyFullAdminVote(prefix, admin) - getInteger(voteKey).valueOrElse(0) -} - -func getAdminsList() = { - match (this.getString(keyAdminAddressList())) { - case s:String => s.split(SEP) - case _ => [] - } -} - -func isInAdminList(address: String) = { - getAdminsList().containsElement(address) -} - -# Generate List of keys with same prefix for all admins -func genVotesKeysHelper(a: (List[String], String), adminAddress: String) = { - let (result, prefix) = a - (result :+ keyFullAdminVote(prefix, adminAddress), prefix) -} -func genVotesKeys(keyPrefix: String) = { - let adminList = keyAdminAddressList() - let (result, prefix) = FOLD<5>(getAdminsList(), ([], keyPrefix), genVotesKeysHelper) - result -} - -# Count all votes for Prefix -func countVotesHelper(result: Int, voteKey: String) = { - result + getInteger(voteKey).valueOrElse(0) -} -func countVotes(prefix: String) = { - let votes = genVotesKeys(prefix) - FOLD<5>(votes, 0, countVotesHelper) -} - -# Generate DeleteEntry for all votes with Prefix -func clearVotesHelper(result: List[DeleteEntry], key: String) = { - result :+ DeleteEntry(key) -} -func getClearVoteEntries(prefix: String) = { - let votes = genVotesKeys(prefix) - FOLD<5>(votes, [], clearVotesHelper) -} - -func voteINTERNAL( - callerAddressString: String, - keyPrefix: String, - minVotes: Int, - voteResult: List[StringEntry|IntegerEntry|DeleteEntry] -) = { - let voteKey = keyFullAdminVote(keyPrefix, callerAddressString) - let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString) - - strict err = if (!isInAdminList(callerAddressString)) then { - throwErr("Address: " + callerAddressString + " not in Admin list") - } else if (adminCurrentVote == 1) then { - throwErr(voteKey + " you already voted") - } else { unit } - - let votes = countVotes(keyPrefix) - if (votes + 1 >= minVotes) then { - let clearVoteEntries = getClearVoteEntries(keyPrefix) - clearVoteEntries ++ voteResult - } else { - [ IntegerEntry(voteKey, 1) ] - } +func getManagerPublicKeyOrUnit() = { + match (factoryAddressOption) { + case fa:Address => { + match (fa.getString(keyManagerPublicKey())) { + case pub:String => pub.fromBase58String() + case _ => unit + } + } + case _ => unit + } } @Callable(i) @@ -141,30 +50,12 @@ func transferWaves(recipientBytes: ByteVector, amount: Int) = { ] } -# Vote for txId that is allowed in Verifier -@Callable(i) -func voteForTxId(txId: String) = { - let callerAddressString = toBase58String(i.caller.bytes) - let keyPrefix = keyAllowedTxIdVotePrefix(txId) - let result = [ StringEntry(keyAllowedTxId(), txId) ] - let allowedTxIdOption = this.getString(keyAllowedTxId()) - - strict err = [ - txId.fromBase58String().size() == TXID_BYTES_LENGTH || throwErr(txId + " is not valid txId"), - allowedTxIdOption == unit || allowedTxIdOption.value() != txId || throwErr(txId + " is already allowed") - ] - - voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result) -} - @Verifier(tx) func verify() = { - let allowedTxIdStringOption = getString(keyAllowedTxId()) - let currentAdminList = getAdminsList() - let byProposal = votingResultContract.getBoolean(keyProposalAllowBroadcast(this, tx.id)).valueOrElse(false) - let byAdmins = allowedTxIdStringOption != unit && tx.id == allowedTxIdStringOption.value().fromBase58String() - let byOwner = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) - if (configAddressOption != unit && currentAdminList.size() == ADMIN_LIST_SIZE) then { - (votingResultContractOption != unit && byProposal) || byAdmins - } else byOwner + let publicKey = match (getManagerPublicKeyOrUnit()) { + case pub:ByteVector => pub + case _ => tx.senderPublicKey + } + + sigVerify(tx.bodyBytes, tx.proofs[0], publicKey) } diff --git a/migrations/factory_init.json b/migrations/factory_init.json index 8435d96..19d15b2 100644 --- a/migrations/factory_init.json +++ b/migrations/factory_init.json @@ -66,6 +66,11 @@ "type": "integer", "value": 65116200000000 }, + { + "key": "%s__blockProcessingReward", + "type": "integer", + "value": 500000 + }, { "key": "%s%s__available__3P2EDoG2nxrXGwcGT8RkGhWJje61ZMCuXr3", "type": "integer", From 2f1b4fa5239bb6a36efe68894fde6d6220c533c7 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 4 Jul 2023 17:28:45 +0300 Subject: [PATCH 104/143] Rename variable Feature Treasure -> Main Treasure --- contracts/calculator/calculator.ride | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 25beac2..f221850 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -91,14 +91,14 @@ let proxyTreasuryAddressOption = match factoryAddressOption { } let proxyTreasuryAddressOrFail = proxyTreasuryAddressOption.valueOrErrorMessage(wrapErr("invalid proxy treasury address")) -let featureTreasuryAddressOption = match factoryAddressOption { +let mainTreasuryAddressOption = match factoryAddressOption { case a: Address => match a.getString(keyMainTreasuryAddress()) { case s: String => s.addressFromString() case _: Unit => unit } case _: Unit => unit } -let featureTreasuryAddressOrFail = featureTreasuryAddressOption.valueOrErrorMessage(wrapErr("invalid feature treasury address")) +let mainTreasuryAddressOrFail = mainTreasuryAddressOption.valueOrErrorMessage(wrapErr("invalid main treasury address")) func getManagerPublicKeyOrUnit() = { match (factoryAddressOption) { @@ -186,7 +186,7 @@ func finalize( let periodEndHeight = currentStartHeight + periodLength - 1 strict checks = [ - i.originCaller == featureTreasuryAddressOrFail || throwErr("permission denied"), + i.originCaller == mainTreasuryAddressOrFail || throwErr("permission denied"), nextBlockToProcess > periodEndHeight || throwErr("unprocessed blocks"), newTreasuryVolumeInWaves >= 0 || throwErr("invalid new treasury volume"), pwrManagersBonusInWaves >= 0 || throwErr("invalid PWR managers bonus"), @@ -288,7 +288,7 @@ func invest(userAddressBytes: ByteVector) = { let invested = factoryAddressOrFail.getInteger(keyInvested(unit)).valueOrElse(0) let actions = [ - ScriptTransfer(featureTreasuryAddressOrFail, paymentAmount, paymentAssetId) + ScriptTransfer(mainTreasuryAddressOrFail, paymentAmount, paymentAssetId) ] let factoryActions = [ @@ -506,7 +506,7 @@ func processBlocks(userAddressBytes: ByteVector) = { nextBlockToProcess + blocksProcessingBatchSize ], []), factoryAddressOrFail.invoke("transferFromProxyTreasury", [ - featureTreasuryAddressOrFail.bytes, + mainTreasuryAddressOrFail.bytes, rewardToMainTreasuryAmount ], []), factoryAddressOrFail.invoke("transferFromProxyTreasury", [ From 9d3aef9083303b2235eb1848a938b9137a6e1e3a Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 4 Jul 2023 18:38:45 +0300 Subject: [PATCH 105/143] Update init data --- migrations/factory_init.json | 5 +++++ migrations/proxy_treasury_set_factory.json | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/migrations/factory_init.json b/migrations/factory_init.json index 19d15b2..2cad70c 100644 --- a/migrations/factory_init.json +++ b/migrations/factory_init.json @@ -255,6 +255,11 @@ "key": "%s%s__available__3PQhGvLgHdUt4GviS8wX5ZwqAZQPv5mnUoi", "type": "integer", "value": 25000000000 + }, + { + "key": "%s__adminAddressList", + "type": "string", + "value": "3PBUguU83ccjXz7NBbR3vn67fVHawbxwaTH__3PLU2bd4CDhHC35bf5qsQxYLpkEkpgkrcvc__3PF3AgB3cEE8F9ZUxuA9aLyM2PBjKrrszZQ__3PHdaP2BLUXFacnqZm6WoFjidvzqZZMbb8j__3P33RBZUXcdx5JW918DqFfrscEuEZpAPUPz" } ], "proofs": [], diff --git a/migrations/proxy_treasury_set_factory.json b/migrations/proxy_treasury_set_factory.json index 18b701a..f62bd91 100644 --- a/migrations/proxy_treasury_set_factory.json +++ b/migrations/proxy_treasury_set_factory.json @@ -5,6 +5,14 @@ "key": "%s__factory", "type": "string", "value": "3PJVm7xLPabmYohbnvdgGDYHMwnZxF2x18m" + }, + { + "key": "%s__adminAddressList", + "value": null + }, + { + "key": "%s__config", + "value": null } ], "proofs": [], From 7c8a565ccfa1c780030c03ec5744d1b3d777e06d Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 4 Jul 2023 18:49:31 +0300 Subject: [PATCH 106/143] More init data --- migrations/factory_init.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/migrations/factory_init.json b/migrations/factory_init.json index 2cad70c..f566664 100644 --- a/migrations/factory_init.json +++ b/migrations/factory_init.json @@ -260,6 +260,11 @@ "key": "%s__adminAddressList", "type": "string", "value": "3PBUguU83ccjXz7NBbR3vn67fVHawbxwaTH__3PLU2bd4CDhHC35bf5qsQxYLpkEkpgkrcvc__3PF3AgB3cEE8F9ZUxuA9aLyM2PBjKrrszZQ__3PHdaP2BLUXFacnqZm6WoFjidvzqZZMbb8j__3P33RBZUXcdx5JW918DqFfrscEuEZpAPUPz" + }, + { + "key": "%s__managerPublicKey", + "type": "string", + "value": "8FkC1gHej3uofJ24ba24sYfbsmUvoZsrwKpf67v3chYM" } ], "proofs": [], From 3ca6a9b5ed120ac357f13db66dd4b7c1db10664a Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Wed, 5 Jul 2023 15:33:58 +0300 Subject: [PATCH 107/143] Fixed donated amount update Fixed negative invest and donation case --- contracts/calculator/calculator.ride | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index f221850..0688255 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -225,7 +225,15 @@ func finalize( ) let donationProfitPart = donationProfitPartRaw - amountToInvestment + amountToDonation let investmentProfitPart = investmentProfitPartRaw - amountToDonation + amountToInvestment - let investedWavesAmountNew = investedWavesAmount + investmentProfitPart + + let donatedWavesAmountNewRaw = donatedWavesAmount + donationProfitPart + let investedWavesAmountNewRaw = investedWavesAmount + investmentProfitPart + + let donatedPartDebt = min([0, donatedWavesAmountNewRaw]) + let investedPartDebt = min([0, investedWavesAmountNewRaw]) + + let donatedWavesAmountNew = max([0, donatedWavesAmountNewRaw]) + investedPartDebt + let investedWavesAmountNew = max([0, investedWavesAmountNewRaw]) + donatedPartDebt let newPeriod = currentPeriodOrFail + 1 # calculate new price @@ -234,8 +242,6 @@ func finalize( let newPrice = fraction(investedWavesAmountNew, SCALE8, lpAssetQuantity) let lpAssetAmountToBurn = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) - let newLpAmount = lpAssetQuantity - lpAssetAmountToBurn - let newInvestAmount = max([0, fraction(newLpAmount, newPrice, SCALE8)]) let paymentAmountMin = max([0, fraction(lpAssetAmountToBurn, newPrice, SCALE8)]) let paymentOption = if (i.payments.size() > 0) then i.payments[0] else unit let paymentAmount = paymentOption.value().amount @@ -262,8 +268,10 @@ func finalize( # burn total withdrawal amount factoryAddressOrFail.invoke("burn", [lpAssetAmountToBurn], []), factoryAddressOrFail.invoke("integerEntry", [keyWithdrawal(), 0], []), - # Calc new invested amount - factoryAddressOrFail.invoke("integerEntry", [keyInvested(unit), newInvestAmount], []) + # new invested amount + factoryAddressOrFail.invoke("integerEntry", [keyInvested(unit), investedWavesAmountNew], []), + # new donated amount + factoryAddressOrFail.invoke("integerEntry", [keyDonated(unit), donatedWavesAmountNew], []) ] (actions, factoryActions) From caba9098184a82520703eab6a3ac2704ba4f3c28 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Wed, 5 Jul 2023 16:02:12 +0300 Subject: [PATCH 108/143] Price cannot be 0 (zero) --- contracts/calculator/calculator.ride | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 0688255..4a27b71 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -255,6 +255,8 @@ func finalize( ) ) then true else throwErr("invalid payments, payment amount min: " + paymentAmountMin.toString()) + strict checkIfPriceNotZero = (newPrice != 0) || throwErr("LP price cannot be 0") + let actions = if (paymentOption != unit) then [ ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId) ] else nil From e792e9fbbf367c60c02b6c69ae07159873ce89c1 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Wed, 5 Jul 2023 16:12:17 +0300 Subject: [PATCH 109/143] Added invest amount update on withdraw --- contracts/calculator/calculator.ride | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 4a27b71..0700cc5 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -240,6 +240,7 @@ func finalize( let lpAssetQuantity = lpAssetIdOrFail.assetInfo() .valueOrErrorMessage(wrapErr("invalid lpAsset info")).quantity let newPrice = fraction(investedWavesAmountNew, SCALE8, lpAssetQuantity) + strict checkIfPriceNotZero = (newPrice != 0) || throwErr("LP price cannot be 0") let lpAssetAmountToBurn = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) let paymentAmountMin = max([0, fraction(lpAssetAmountToBurn, newPrice, SCALE8)]) @@ -255,8 +256,6 @@ func finalize( ) ) then true else throwErr("invalid payments, payment amount min: " + paymentAmountMin.toString()) - strict checkIfPriceNotZero = (newPrice != 0) || throwErr("LP price cannot be 0") - let actions = if (paymentOption != unit) then [ ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId) ] else nil @@ -271,7 +270,7 @@ func finalize( factoryAddressOrFail.invoke("burn", [lpAssetAmountToBurn], []), factoryAddressOrFail.invoke("integerEntry", [keyWithdrawal(), 0], []), # new invested amount - factoryAddressOrFail.invoke("integerEntry", [keyInvested(unit), investedWavesAmountNew], []), + factoryAddressOrFail.invoke("integerEntry", [keyInvested(unit), investedWavesAmountNew - paymentAmountMin], []), # new donated amount factoryAddressOrFail.invoke("integerEntry", [keyDonated(unit), donatedWavesAmountNew], []) ] From 484e54cda638a129416c47db147898c313497e05 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Thu, 6 Jul 2023 12:04:44 +0300 Subject: [PATCH 110/143] Added finalizeREADONLY function Power manager bonus amount saved to state --- contracts/calculator/calculator.ride | 160 +++++++++++++++++++-------- contracts/factory/factory.ride | 19 ++++ 2 files changed, 130 insertions(+), 49 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 0700cc5..34a5ab7 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -40,6 +40,7 @@ func keyClaimed(userAddress: Address) = ["%s%s", "claimed", userAddress.toString func keyCurrentPeriod() = ["%s", "currentPeriod"].makeString(SEP) func keyPriceForPeriod(period: Int) = ["%s%d", "price", period.toString()].makeString(SEP) func keyStartHeight(period: Int) = ["%s%d", "startHeight", period.toString()].makeString(SEP) +func keyPowerManagerBonus(period: Int) = ["%s%d", "powerManagerBonus", period.toString()].makeString(SEP) func keyPeriodLength() = "%s__periodLength" func keyBlockProcessingReward() = "%s__blockProcessingReward" func keyNextBlockToProcess() = "%s__nextBlockToProcess" @@ -131,6 +132,68 @@ func rewardForOption(rewards: List[(Address, Int)], target: Address) = { else unit } +func finalizeINTERNAL( + newTreasuryVolumeInWaves: Int, + pwrManagersBonusInWaves: Int, + treasuryVolumeDiffAllocationCoef: Int +) = { + let donatedWavesAmount = factoryAddressOrFail.getInteger( + keyDonated(unit) + ).valueOrElse(0) + let investedWavesAmount = factoryAddressOrFail.getInteger( + keyInvested(unit) + ).valueOrElse(0) + + let currentTreasuryVolumeInWaves = donatedWavesAmount + investedWavesAmount + let profitRaw = newTreasuryVolumeInWaves - currentTreasuryVolumeInWaves + + let pwrManagersBonusAmount = if (pwrManagersBonusInWaves <= profitRaw || pwrManagersBonusInWaves == 0) + then pwrManagersBonusInWaves + else throwErr("power bonus is more than profit") + let profit = profitRaw - pwrManagersBonusAmount + let donationPart = if (currentTreasuryVolumeInWaves > 0) + then fraction(donatedWavesAmount, SCALE8, currentTreasuryVolumeInWaves) + else 0 + let donationProfitPartRaw = fraction(profit, donationPart, SCALE8) + let investmentProfitPartRaw = profit - donationProfitPartRaw + let treasuryVolumeDiffAllocationCoefAbs = abs(treasuryVolumeDiffAllocationCoef) + let amountToDonation = fraction( + investmentProfitPartRaw, + if (treasuryVolumeDiffAllocationCoef < 0) then treasuryVolumeDiffAllocationCoefAbs else 0, + SCALE8 + ) + let amountToInvestment = fraction( + donationProfitPartRaw, + if (treasuryVolumeDiffAllocationCoef > 0) then treasuryVolumeDiffAllocationCoefAbs else 0, + SCALE8 + ) + let donationProfitPart = donationProfitPartRaw - amountToInvestment + amountToDonation + let investmentProfitPart = investmentProfitPartRaw - amountToDonation + amountToInvestment + + let donatedWavesAmountNewRaw = donatedWavesAmount + donationProfitPart + let investedWavesAmountNewRaw = investedWavesAmount + investmentProfitPart + + let donatedPartDebt = min([0, donatedWavesAmountNewRaw]) + let investedPartDebt = min([0, investedWavesAmountNewRaw]) + + let donatedWavesAmountNew = max([0, donatedWavesAmountNewRaw]) + investedPartDebt + let investedWavesAmountNew = max([0, investedWavesAmountNewRaw]) + donatedPartDebt + + # calculate new price + let lpAssetQuantity = lpAssetIdOrFail.assetInfo() + .valueOrErrorMessage(wrapErr("invalid lpAsset info")).quantity + let newPrice = fraction(investedWavesAmountNew, SCALE8, lpAssetQuantity) + strict checkIfPriceNotZero = (newPrice != 0) || throwErr("LP price cannot be 0") + + let lpAssetAmountToBurn = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) + let paymentAmountMin = max([0, fraction(lpAssetAmountToBurn, newPrice, SCALE8)]) + + let finalInvestedWavesAmount = investedWavesAmountNew - paymentAmountMin + let lpAssetFinalQuantity = lpAssetQuantity - lpAssetAmountToBurn + + (paymentAmountMin, finalInvestedWavesAmount, donatedWavesAmountNew, newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity) +} + @Callable(i) func claimLP(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() @@ -194,56 +257,17 @@ func finalize( || throwErr("invalid treasury volume diff allocation coefficient") ] - let donatedWavesAmount = factoryAddressOrFail.getInteger( - keyDonated(unit) - ).valueOrElse(0) - let investedWavesAmount = factoryAddressOrFail.getInteger( - keyInvested(unit) - ).valueOrElse(0) - - let currentTreasuryVolumeInWaves = donatedWavesAmount + investedWavesAmount - let profitRaw = newTreasuryVolumeInWaves - currentTreasuryVolumeInWaves - let pwrManagersBonusAmount = if (profitRaw > 0 && pwrManagersBonusInWaves <= profitRaw) - then pwrManagersBonusInWaves - else 0 - let profit = profitRaw - pwrManagersBonusAmount - let donationPart = if (currentTreasuryVolumeInWaves > 0) - then fraction(donatedWavesAmount, SCALE8, currentTreasuryVolumeInWaves) - else 0 - let donationProfitPartRaw = fraction(profit, donationPart, SCALE8) - let investmentProfitPartRaw = profit - donationProfitPartRaw - let treasuryVolumeDiffAllocationCoefAbs = abs(treasuryVolumeDiffAllocationCoef) - let amountToDonation = fraction( - investmentProfitPartRaw, - if (treasuryVolumeDiffAllocationCoef < 0) then treasuryVolumeDiffAllocationCoefAbs else 0, - SCALE8 - ) - let amountToInvestment = fraction( - donationProfitPartRaw, - if (treasuryVolumeDiffAllocationCoef > 0) then treasuryVolumeDiffAllocationCoefAbs else 0, - SCALE8 - ) - let donationProfitPart = donationProfitPartRaw - amountToInvestment + amountToDonation - let investmentProfitPart = investmentProfitPartRaw - amountToDonation + amountToInvestment - - let donatedWavesAmountNewRaw = donatedWavesAmount + donationProfitPart - let investedWavesAmountNewRaw = investedWavesAmount + investmentProfitPart - - let donatedPartDebt = min([0, donatedWavesAmountNewRaw]) - let investedPartDebt = min([0, investedWavesAmountNewRaw]) - - let donatedWavesAmountNew = max([0, donatedWavesAmountNewRaw]) + investedPartDebt - let investedWavesAmountNew = max([0, investedWavesAmountNewRaw]) + donatedPartDebt + # Finalize calcualtions + let ( + paymentAmountMin, + finalInvestedWavesAmount, + donatedWavesAmountNew, + newPrice, + lpAssetAmountToBurn, + lpAssetFinalQuantity + ) = finalizeINTERNAL(newTreasuryVolumeInWaves, pwrManagersBonusInWaves, treasuryVolumeDiffAllocationCoef) let newPeriod = currentPeriodOrFail + 1 - # calculate new price - let lpAssetQuantity = lpAssetIdOrFail.assetInfo() - .valueOrErrorMessage(wrapErr("invalid lpAsset info")).quantity - let newPrice = fraction(investedWavesAmountNew, SCALE8, lpAssetQuantity) - strict checkIfPriceNotZero = (newPrice != 0) || throwErr("LP price cannot be 0") - - let lpAssetAmountToBurn = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) - let paymentAmountMin = max([0, fraction(lpAssetAmountToBurn, newPrice, SCALE8)]) let paymentOption = if (i.payments.size() > 0) then i.payments[0] else unit let paymentAmount = paymentOption.value().amount let paymentAssetId = paymentOption.value().assetId @@ -261,6 +285,8 @@ func finalize( ] else nil let factoryActions = [ + # write power manager bonus + factoryAddressOrFail.invoke("integerEntry", [keyPowerManagerBonus(currentPeriodOrFail), pwrManagersBonusInWaves], []), # update period factoryAddressOrFail.invoke("integerEntry", [keyCurrentPeriod(), newPeriod], []), # update price @@ -270,7 +296,7 @@ func finalize( factoryAddressOrFail.invoke("burn", [lpAssetAmountToBurn], []), factoryAddressOrFail.invoke("integerEntry", [keyWithdrawal(), 0], []), # new invested amount - factoryAddressOrFail.invoke("integerEntry", [keyInvested(unit), investedWavesAmountNew - paymentAmountMin], []), + factoryAddressOrFail.invoke("integerEntry", [keyInvested(unit), finalInvestedWavesAmount], []), # new donated amount factoryAddressOrFail.invoke("integerEntry", [keyDonated(unit), donatedWavesAmountNew], []) ] @@ -278,6 +304,42 @@ func finalize( (actions, factoryActions) } +@Callable(i) +func finalizeREADONLY( + newTreasuryVolumeInWaves: Int, + pwrManagersBonusInWaves: Int, + treasuryVolumeDiffAllocationCoef: Int # -1..1×10⁸ +) = { + let currentPeriodOrFail = + factoryAddressOrFail.getInteger(keyCurrentPeriod()) + .valueOrErrorMessage(wrapErr("invalid period")) + let periodLength = + factoryAddressOrFail.getInteger(keyPeriodLength()) + .valueOrErrorMessage(wrapErr("invalid period length")) + let currentStartHeight = factoryAddressOrFail + .getInteger(keyStartHeight(currentPeriodOrFail)) + .valueOrErrorMessage(wrapErr("invalid start height")) + let currentPriceOrFail = + factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)) + .valueOrErrorMessage(wrapErr("invalid price")) + let nextBlockToProcess = factoryAddressOrFail + .getInteger(keyNextBlockToProcess()) + .valueOrErrorMessage(wrapErr("invalid next block to process")) + + let periodEndHeight = currentStartHeight + periodLength - 1 + + strict checks = [ + nextBlockToProcess > periodEndHeight || throwErr("unprocessed blocks"), + newTreasuryVolumeInWaves >= 0 || throwErr("invalid new treasury volume"), + pwrManagersBonusInWaves >= 0 || throwErr("invalid PWR managers bonus"), + treasuryVolumeDiffAllocationCoef >= -SCALE8 && treasuryVolumeDiffAllocationCoef <= SCALE8 + || throwErr("invalid treasury volume diff allocation coefficient") + ] + + # Finalize calcualtions + ([], finalizeINTERNAL(newTreasuryVolumeInWaves, pwrManagersBonusInWaves, treasuryVolumeDiffAllocationCoef)) +} + # payment in waves @Callable(i) func invest(userAddressBytes: ByteVector) = { diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 429a3b6..6bf36dc 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -249,6 +249,25 @@ func finalize( ) } +@Callable(i) +func finalizeREADONLY( + newTreasuryVolumeInWaves: Int, + pwrManagersBonusInWaves: Int, + treasuryVolumeDiffAllocationCoef: Int +) = { + ( + nil, + calculatorAddressOrFail.reentrantInvoke( + "finalizeREADONLY", + [ + newTreasuryVolumeInWaves, + pwrManagersBonusInWaves, + treasuryVolumeDiffAllocationCoef + ], [] + ) + ) +} + @Callable(i) func claimLP() = (nil, calculatorAddressOrFail.reentrantInvoke("claimLP", [i.caller.bytes], i.payments)) From 6b1b5c27f72ab5298a802088aa3b976470c0fed7 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Thu, 6 Jul 2023 12:18:42 +0300 Subject: [PATCH 111/143] Added comments --- contracts/calculator/calculator.ride | 9 +++++++++ contracts/factory/factory.ride | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 34a5ab7..9c71fdd 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -304,6 +304,15 @@ func finalize( (actions, factoryActions) } +# Returned values: +# +# _1 = minPaymentAmount +# _2 = newInvestedWavesAmount +# _3 = newDonatedWavesAmountNew +# _4 = newPrice +# _5 = lpAssetAmountToBurn +# _6 = lpAssetNewQuantity +# @Callable(i) func finalizeREADONLY( newTreasuryVolumeInWaves: Int, diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 6bf36dc..859b5dc 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -249,6 +249,15 @@ func finalize( ) } +# Returned values: +# +# _1 = minPaymentAmount +# _2 = newInvestedWavesAmount +# _3 = newDonatedWavesAmountNew +# _4 = newPrice +# _5 = lpAssetAmountToBurn +# _6 = lpAssetNewQuantity +# @Callable(i) func finalizeREADONLY( newTreasuryVolumeInWaves: Int, From a904d4d191dbe256f9c8307d07dfbf87a7016c9f Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Thu, 6 Jul 2023 12:29:30 +0300 Subject: [PATCH 112/143] Changed paymentAmount validation Payment amount should be equal to claimed waves amount --- contracts/calculator/calculator.ride | 6 +++--- contracts/factory/factory.ride | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 9c71fdd..b572d43 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -276,9 +276,9 @@ func finalize( || ( paymentOption != unit && paymentAssetId == unit - && paymentAmount >= paymentAmountMin + && paymentAmount == paymentAmountMin ) - ) then true else throwErr("invalid payments, payment amount min: " + paymentAmountMin.toString()) + ) then true else throwErr("invalid payments, payment amount should be: " + paymentAmountMin.toString()) let actions = if (paymentOption != unit) then [ ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId) @@ -306,7 +306,7 @@ func finalize( # Returned values: # -# _1 = minPaymentAmount +# _1 = wavesToClaimPaymentAmount # _2 = newInvestedWavesAmount # _3 = newDonatedWavesAmountNew # _4 = newPrice diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 859b5dc..5cc7948 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -251,7 +251,7 @@ func finalize( # Returned values: # -# _1 = minPaymentAmount +# _1 = wavesToClaimPaymentAmount # _2 = newInvestedWavesAmount # _3 = newDonatedWavesAmountNew # _4 = newPrice From 14dd97731c0c53fb50ab1c459b2102ae1b642a33 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Fri, 14 Jul 2023 10:29:30 +0300 Subject: [PATCH 113/143] Update specs --- contracts/calculator/calculator.md | 6 +- contracts/factory/factory.md | 121 +++++++++++++++++++++++---- contracts/treasury/proxy_treasury.md | 14 ++++ 3 files changed, 124 insertions(+), 17 deletions(-) create mode 100644 contracts/treasury/proxy_treasury.md diff --git a/contracts/calculator/calculator.md b/contracts/calculator/calculator.md index c227289..b3d8f07 100644 --- a/contracts/calculator/calculator.md +++ b/contracts/calculator/calculator.md @@ -1,5 +1,5 @@ ### Required state entries -| key | type | -| :------------ | :------- | -| `%s__factory` | `String` | +| key | type | description | +| :------------ | :------- | :-------------- | +| `%s__factory` | `String` | Factory address | diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index e3fca85..a004c88 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -1,16 +1,109 @@ ### Required state entries -| key | type | -| :---------------------------- | :------- | -| `%s__calculator` | `String` | -| `%s__proxyTreasury` | `String` | -| `%s__mainTreasury` | `String` | -| `%s__config` | `String` | -| `%s__lpAssetId` | `String` | -| `%s__currentPeriod` | `Int` | -| `%s__periodLength` | `Int` | -| `%s%s__invested__WAVES` | `Int` | -| `%s%s__donated__WAVES` | `Int` | -| `%s%d__startHeight__` | `Int` | -| `%s%d__price__` | `Int` | -| `%s__nextBlockToProcess` | `Int` | +| key | type | description | +| :---------------------------- | :------- | :---------------------------- | +| `%s__calculator` | `String` | Calculator Address | +| `%s__proxyTreasury` | `String` | Proxy Treasury Address | +| `%s__mainTreasury` | `String` | Main Treasury Address | +| `%s__config` | `String` | DAO Config address | +| `%s__lpAssetId` | `String` | LP Asset ID | +| `%s__currentPeriod` | `Int` | Current period num | +| `%s__periodLength` | `Int` | Period length in blocks | +| `%s%s__invested__WAVES` | `Int` | Invested Amount in Waves | +| `%s%s__donated__WAVES` | `Int` | Donated Amount in Waves | +| `%s%d__startHeight__` | `Int` | Starting Height of `` | +| `%s%d__price__` | `Int` | LP Asset Price for `` | +| `%s__nextBlockToProcess` | `Int` | Next block height to process | + +### User state +| key | type | description | +| :------------------------------------------ | :------- | :--------------------------------- | +| `%s%s__available__` | `Int` | Available LP Asset amount to Claim | +| `%s%s__claimed__` | `Int` | LP Asset amount already claimed | +| `%s%s%s__withdrawal____` | `String` | Withdrawl request parameters | +``` +# Withdrawl request value format +%s%d%d%s________ +``` + + +### User functions +#### Claim LP +User can claim available LP Assets +``` +@Callable(i) +func claimLP() +``` +#### Invest Waves +User attach Waves payment and receive LP Asset at the current price +``` +@Callable(i) +func invest() +``` +#### Withdraw request +User attach LP Asset and creates withdraw request. +Claim can be done at the next Period +``` +@Callable(i) +func withdraw() +``` +#### Withdraw request cancellation +Cancel withdraw request. +`txIdStr` - withdraw request TxId +``` +@Callable(i) +func cancelWithdraw(txIdStr: String) +``` +#### Claim Waves +Claim Waves from withdraw request at current price. +`txIdStr` - withdraw request TxId +``` +func claimWaves(txIdStr: String) +``` +### Block processing +Process block miners rewards. +``` +@Callable(i) +func processBlocks() +``` + +### Helper functions +- Can only be called by Calculator +#### Factory state functions +``` +@Callable(i) +func stringEntry(key: String, val: String) + +@Callable(i) +func integerEntry(key: String, val: Int) + +@Callable(i) +func booleanEntry(key: String, val: Boolean) + +@Callable(i) +func binaryEntry(key: String, val: ByteVector) + +@Callable(i) +func deleteEntry(key: String) +``` +#### LP Asset functions +``` +@Callable(i) +func reissue(amount: Int) + +@Callable(i) +func burn(amount: Int) +``` +#### Asset transfer functions +``` +@Callable(i) +func transferAsset(recepientBytes: ByteVector, amount: Int, assetId: ByteVector) + +@Callable(i) +func transferWaves(recepientBytes: ByteVector, amount: Int) +``` +#### Transfer Waves from Proxy treasury +``` +@Callable(i) +func transferFromProxyTreasury(recipientBytes: ByteVector, rewardsAmount: Int) +``` diff --git a/contracts/treasury/proxy_treasury.md b/contracts/treasury/proxy_treasury.md new file mode 100644 index 0000000..e8964f8 --- /dev/null +++ b/contracts/treasury/proxy_treasury.md @@ -0,0 +1,14 @@ +### Required state entries + +| key | type | description | +| :------------ | :------- | :-------------- | +| `%s__factory` | `String` | Factory address | + +### Callable functions + +Sends `amount` Waves to provided recipient +- Can only be called by Factory +``` +@Callable(i) +func transferWaves(recipientBytes: ByteVector, amount: Int) +``` From f0d002723e77b513342aca7cdc33cb6278246df3 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Fri, 14 Jul 2023 11:41:05 +0300 Subject: [PATCH 114/143] Added finalization spec --- contracts/factory/factory.md | 58 +++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index a004c88..975a72d 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -20,9 +20,9 @@ | :------------------------------------------ | :------- | :--------------------------------- | | `%s%s__available__` | `Int` | Available LP Asset amount to Claim | | `%s%s__claimed__` | `Int` | LP Asset amount already claimed | -| `%s%s%s__withdrawal____` | `String` | Withdrawl request parameters | +| `%s%s%s__withdrawal____` | `String` | Withdrawal request parameters | ``` -# Withdrawl request value format +# Withdrawal request value format %s%d%d%s________ ``` @@ -66,6 +66,56 @@ Process block miners rewards. @Callable(i) func processBlocks() ``` +### Finalize evaluation +Evaluate finalization results and required Waves amount to finish finalization. +Arguments: +- `newTreasuryVolumeInWaves` - Total treasury volume in Waves, include Invested and Donated amounts +- `pwrManagersBonusInWaves` - Power Manager bonus in Waves, this amount is deducted from Total profit when LP Price is calculated +- `treasuryVolumeDiffAllocationCoef` - Allocation coefficient ([-100000000; 100000000]), Profit/Loss distribution proportion. + - `0` - Profit/Loss distributed to Invested and Donated evenly by their proportion amount + - `-100000000` All Profit/Loss is allocated to Donated part + - `100000000` All Profit/Loss is allocated to Invested part + - `-60000000` 60% of Invested part Profit/Loss is added to Donated part + - `44000000` 44% of Donated part Profit/Loss is added to Invested part + +Return values: +- `_1 = wavesToClaimPaymentAmount` - amount of Waves in payment needed to finish finalization +- `_2 = newInvestedWavesAmount` - new Invested Waves amount after finalization +- `_3 = newDonatedWavesAmountNew` - new Donated Waves amount after finalization +- `_4 = newPrice` - new Price for next Period +- `_5 = lpAssetAmountToBurn` - Amount of LP Assets burned for all withdrawals in current Period +- `_6 = lpAssetNewQuantity` - LP Asset new quantity +``` +@Callable(i) +func finalizeREADONLY( + newTreasuryVolumeInWaves: Int, + pwrManagersBonusInWaves: Int, + treasuryVolumeDiffAllocationCoef: Int +) +``` + +### Finalization +Finalize current period and calculate new Price. +- Payment should include exact Waves amount needed to process all withdrawal requests. +- Can only be called by Main Treasury + +Arguments: +- `newTreasuryVolumeInWaves` - Total treasury volume in Waves, include Invested and Donated amounts +- `pwrManagersBonusInWaves` - Power Manager bonus in Waves, this amount is deducted from Total profit when LP Price is calculated +- `treasuryVolumeDiffAllocationCoef` - Allocation coefficient ([-100000000; 100000000]), Profit/Loss distribution proportion. + - `0` - Profit/Loss distributed to Invested and Donated evenly by their proportion amount + - `-100000000` All Profit/Loss is allocated to Donated part + - `100000000` All Profit/Loss is allocated to Invested part + - `-60000000` 60% of Invested part Profit/Loss is added to Donated part + - `44000000` 44% of Donated part Profit/Loss is added to Invested part +``` +@Callable(i) +func finalize( + newTreasuryVolumeInWaves: Int, + pwrManagersBonusInWaves: Int, + treasuryVolumeDiffAllocationCoef: Int +) +``` ### Helper functions - Can only be called by Calculator @@ -97,10 +147,10 @@ func burn(amount: Int) #### Asset transfer functions ``` @Callable(i) -func transferAsset(recepientBytes: ByteVector, amount: Int, assetId: ByteVector) +func transferAsset(recipientBytes: ByteVector, amount: Int, assetId: ByteVector) @Callable(i) -func transferWaves(recepientBytes: ByteVector, amount: Int) +func transferWaves(recipientBytes: ByteVector, amount: Int) ``` #### Transfer Waves from Proxy treasury ``` From a1bf02d1290802c09395ed40fa3b8e038fe35666 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Fri, 14 Jul 2023 11:47:26 +0300 Subject: [PATCH 115/143] Reworded --- contracts/factory/factory.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index 975a72d..e296954 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -72,11 +72,11 @@ Arguments: - `newTreasuryVolumeInWaves` - Total treasury volume in Waves, include Invested and Donated amounts - `pwrManagersBonusInWaves` - Power Manager bonus in Waves, this amount is deducted from Total profit when LP Price is calculated - `treasuryVolumeDiffAllocationCoef` - Allocation coefficient ([-100000000; 100000000]), Profit/Loss distribution proportion. - - `0` - Profit/Loss distributed to Invested and Donated evenly by their proportion amount + - `0` - Profit/Loss distributed to Invested and Donated evenly by their amounts proportions - `-100000000` All Profit/Loss is allocated to Donated part - `100000000` All Profit/Loss is allocated to Invested part - - `-60000000` 60% of Invested part Profit/Loss is added to Donated part - - `44000000` 44% of Donated part Profit/Loss is added to Invested part + - `-60000000` 60% of Invested Profit/Loss part is added to Donated part + - `44000000` 44% of Donated Profit/Loss part is added to Invested part Return values: - `_1 = wavesToClaimPaymentAmount` - amount of Waves in payment needed to finish finalization @@ -103,11 +103,11 @@ Arguments: - `newTreasuryVolumeInWaves` - Total treasury volume in Waves, include Invested and Donated amounts - `pwrManagersBonusInWaves` - Power Manager bonus in Waves, this amount is deducted from Total profit when LP Price is calculated - `treasuryVolumeDiffAllocationCoef` - Allocation coefficient ([-100000000; 100000000]), Profit/Loss distribution proportion. - - `0` - Profit/Loss distributed to Invested and Donated evenly by their proportion amount + - `0` - Profit/Loss distributed to Invested and Donated evenly by their amounts proportions - `-100000000` All Profit/Loss is allocated to Donated part - `100000000` All Profit/Loss is allocated to Invested part - - `-60000000` 60% of Invested part Profit/Loss is added to Donated part - - `44000000` 44% of Donated part Profit/Loss is added to Invested part + - `-60000000` 60% of Invested Profit/Loss part is added to Donated part + - `44000000` 44% of Donated Profit/Loss part is added to Invested part ``` @Callable(i) func finalize( From aa4858418f84f28401217b9ff6f3d3e07cc1265d Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Fri, 14 Jul 2023 11:56:57 +0300 Subject: [PATCH 116/143] Reformat --- contracts/factory/factory.md | 47 ++++++++++++++++++++++++++-- contracts/treasury/proxy_treasury.md | 1 + 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index e296954..33ecf9e 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -16,56 +16,81 @@ | `%s__nextBlockToProcess` | `Int` | Next block height to process | ### User state + | key | type | description | | :------------------------------------------ | :------- | :--------------------------------- | | `%s%s__available__` | `Int` | Available LP Asset amount to Claim | | `%s%s__claimed__` | `Int` | LP Asset amount already claimed | -| `%s%s%s__withdrawal____` | `String` | Withdrawal request parameters | +| `%s%s%s__withdrawal____` | `String` | Withdrawal request parameters | + ``` # Withdrawal request value format %s%d%d%s________ ``` +--- ### User functions + #### Claim LP + User can claim available LP Assets + ``` @Callable(i) func claimLP() ``` #### Invest Waves + User attach Waves payment and receive LP Asset at the current price + ``` @Callable(i) func invest() ``` + #### Withdraw request + User attach LP Asset and creates withdraw request. Claim can be done at the next Period + ``` @Callable(i) func withdraw() ``` + #### Withdraw request cancellation + Cancel withdraw request. `txIdStr` - withdraw request TxId + ``` @Callable(i) func cancelWithdraw(txIdStr: String) ``` + #### Claim Waves + Claim Waves from withdraw request at current price. `txIdStr` - withdraw request TxId + ``` func claimWaves(txIdStr: String) ``` + +--- + ### Block processing -Process block miners rewards. + +Process block miners rewards. + ``` @Callable(i) func processBlocks() ``` + +--- + ### Finalize evaluation Evaluate finalization results and required Waves amount to finish finalization. Arguments: @@ -85,6 +110,7 @@ Return values: - `_4 = newPrice` - new Price for next Period - `_5 = lpAssetAmountToBurn` - Amount of LP Assets burned for all withdrawals in current Period - `_6 = lpAssetNewQuantity` - LP Asset new quantity + ``` @Callable(i) func finalizeREADONLY( @@ -94,7 +120,10 @@ func finalizeREADONLY( ) ``` +--- + ### Finalization + Finalize current period and calculate new Price. - Payment should include exact Waves amount needed to process all withdrawal requests. - Can only be called by Main Treasury @@ -108,6 +137,7 @@ Arguments: - `100000000` All Profit/Loss is allocated to Invested part - `-60000000` 60% of Invested Profit/Loss part is added to Donated part - `44000000` 44% of Donated Profit/Loss part is added to Invested part + ``` @Callable(i) func finalize( @@ -117,9 +147,14 @@ func finalize( ) ``` +--- + ### Helper functions + - Can only be called by Calculator -#### Factory state functions + +#### Factory state functions + ``` @Callable(i) func stringEntry(key: String, val: String) @@ -136,7 +171,9 @@ func binaryEntry(key: String, val: ByteVector) @Callable(i) func deleteEntry(key: String) ``` + #### LP Asset functions + ``` @Callable(i) func reissue(amount: Int) @@ -144,7 +181,9 @@ func reissue(amount: Int) @Callable(i) func burn(amount: Int) ``` + #### Asset transfer functions + ``` @Callable(i) func transferAsset(recipientBytes: ByteVector, amount: Int, assetId: ByteVector) @@ -152,7 +191,9 @@ func transferAsset(recipientBytes: ByteVector, amount: Int, assetId: ByteVector) @Callable(i) func transferWaves(recipientBytes: ByteVector, amount: Int) ``` + #### Transfer Waves from Proxy treasury + ``` @Callable(i) func transferFromProxyTreasury(recipientBytes: ByteVector, rewardsAmount: Int) diff --git a/contracts/treasury/proxy_treasury.md b/contracts/treasury/proxy_treasury.md index e8964f8..1cffe67 100644 --- a/contracts/treasury/proxy_treasury.md +++ b/contracts/treasury/proxy_treasury.md @@ -8,6 +8,7 @@ Sends `amount` Waves to provided recipient - Can only be called by Factory + ``` @Callable(i) func transferWaves(recipientBytes: ByteVector, amount: Int) From 1d6ce7d15e008700d83dfa802b097fd7aef05f9f Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Fri, 14 Jul 2023 15:00:25 +0300 Subject: [PATCH 117/143] Update tests --- .mocharc.yaml | 2 +- contracts/calculator/test/_setup.js | 2 + contracts/calculator/test/claim_waves.spec.js | 4 +- contracts/factory/test/_setup.js | 21 +++++++++- .../{treasury => factory}/test/admins.spec.js | 40 +++++++++---------- .../test/vote_for_tx.spec.js | 22 +++++----- 6 files changed, 56 insertions(+), 35 deletions(-) rename contracts/{treasury => factory}/test/admins.spec.js (89%) rename contracts/{treasury => factory}/test/vote_for_tx.spec.js (89%) diff --git a/.mocharc.yaml b/.mocharc.yaml index 4483d24..b57e70d 100644 --- a/.mocharc.yaml +++ b/.mocharc.yaml @@ -1,4 +1,4 @@ -parallel: true +parallel: false timeout: 5m spec: - 'contracts/**/*.spec.js' diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index 785759d..7ce4605 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -15,6 +15,7 @@ import { const nonceLength = 3 const calculatorPath = format({ dir: 'contracts/calculator', base: 'calculator.ride' }) const factoryPath = format({ dir: 'contracts/factory', base: 'factory.ride' }) +const proxyTreasuryPath = format({ dir: 'contracts/treasury', base: 'proxy_treasury.ride' }) const scale8 = 1e8 export const setup = async ({ @@ -110,6 +111,7 @@ export const setup = async ({ await setScriptFromFile(calculatorPath, accounts.calculator.seed) await setScriptFromFile(factoryPath, accounts.factory.seed) + await setScriptFromFile(proxyTreasuryPath, daoSeed) return { accounts, lpAssetId, periodLength, blockProcessingReward, price } } diff --git a/contracts/calculator/test/claim_waves.spec.js b/contracts/calculator/test/claim_waves.spec.js index 18cca08..2f70e38 100644 --- a/contracts/calculator/test/claim_waves.spec.js +++ b/contracts/calculator/test/claim_waves.spec.js @@ -46,7 +46,7 @@ describe(`[${process.pid}] calculator: claim waves`, () => { chainId }, accounts.user1.seed)) - const finalizePaymentAmount = 100e8 + const finalizePaymentAmount = 198809133 const newTreasuryVolumeInWaves = 1100 * 1e8 const pwrManagersBonusinWaves = 100 * 1e8 const treasuryVolumeDiffAllocationCoef = 0 @@ -77,7 +77,7 @@ describe(`[${process.pid}] calculator: claim waves`, () => { chainId }, accounts.user1.seed)) - const transfer = stateChanges.invokes[0].stateChanges.invokes[2].stateChanges.transfers[0] + const transfer = stateChanges.invokes[0].stateChanges.invokes[1].stateChanges.transfers[0] const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') const profitRaw = newTreasuryVolumeInWaves - investedWavesAmount diff --git a/contracts/factory/test/_setup.js b/contracts/factory/test/_setup.js index b779e13..bc7feb2 100644 --- a/contracts/factory/test/_setup.js +++ b/contracts/factory/test/_setup.js @@ -22,7 +22,14 @@ export const setupAccounts = async () => { 'factory', 'calculator', 'treasury', - 'user1' + 'user1', + 'config', + 'votingResult', + 'admin1', + 'admin2', + 'admin3', + 'admin4', + 'admin5' ] const accounts = Object.fromEntries(names.map((item) => { const seed = `${item}#${nonce}` @@ -50,6 +57,18 @@ export const setupAccounts = async () => { chainId }, accounts.factory.seed)) + await broadcastAndWait(data({ + additionalFee: 4e5, + data: [ + { + key: 'contract_voting_result', + type: 'string', + value: accounts.votingResult.address + } + ], + chainId + }, accounts.config.seed)) + const accountsInfo = Object.entries(accounts) .map(([name, { seed, address }]) => [name, address]) console.log(table(accountsInfo, { diff --git a/contracts/treasury/test/admins.spec.js b/contracts/factory/test/admins.spec.js similarity index 89% rename from contracts/treasury/test/admins.spec.js rename to contracts/factory/test/admins.spec.js index 3e22891..ca039e7 100644 --- a/contracts/treasury/test/admins.spec.js +++ b/contracts/factory/test/admins.spec.js @@ -7,7 +7,7 @@ import { setupAccounts } from './_setup.js' chai.use(chaiAsPromised) const { expect } = chai -describe(`[${process.pid}] treasury: admins`, () => { +describe(`[${process.pid}] factory: admins`, () => { let dataTx, accounts before(async () => { @@ -19,10 +19,26 @@ describe(`[${process.pid}] treasury: admins`, () => { data: [{ key: 'foo', type: 'string', value: 'bar' }], chainId }, - accounts.treasury.seed + accounts.factory.seed ) }) + it('owner can set config address if it was not specified', async () => { + const setConfigAddressTx = data({ + additionalFee: 4e5, + data: [ + { + key: '%s__config', + type: 'string', + value: accounts.config.address + } + ], + chainId + }, accounts.factory.seed) + + return expect(broadcastAndWait(setConfigAddressTx)).to.be.fulfilled + }) + it('can set admins by owner initially', async () => { const setAdminsTx = data({ additionalFee: 4e5, @@ -40,26 +56,10 @@ describe(`[${process.pid}] treasury: admins`, () => { } ], chainId - }, accounts.treasury.seed) + }, accounts.factory.seed) return expect(broadcastAndWait(setAdminsTx)).to.be.fulfilled }) - it('owner can set config address if it was not specified', async () => { - const setConfigAddressTx = data({ - additionalFee: 4e5, - data: [ - { - key: '%s__config', - type: 'string', - value: accounts.config.address - } - ], - chainId - }, accounts.treasury.seed) - - return expect(broadcastAndWait(setConfigAddressTx)).to.be.fulfilled - }) - it('owner is denied after admins and config address are specified', async () => { return expect(broadcastAndWait(dataTx)).to.be.rejectedWith('Transaction is not allowed by account-script') }) @@ -69,7 +69,7 @@ describe(`[${process.pid}] treasury: admins`, () => { additionalFee: 4e5, data: [ { - key: `proposal_allow_broadcast_${accounts.treasury.address}_${dataTx.id}`, + key: `proposal_allow_broadcast_${accounts.factory.address}_${dataTx.id}`, type: 'boolean', value: true } diff --git a/contracts/treasury/test/vote_for_tx.spec.js b/contracts/factory/test/vote_for_tx.spec.js similarity index 89% rename from contracts/treasury/test/vote_for_tx.spec.js rename to contracts/factory/test/vote_for_tx.spec.js index 12a9acf..e0569eb 100644 --- a/contracts/treasury/test/vote_for_tx.spec.js +++ b/contracts/factory/test/vote_for_tx.spec.js @@ -7,12 +7,12 @@ import { setupAccounts } from './_setup.js' chai.use(chaiAsPromised) const { expect } = chai -describe(`[${process.pid}] treasury: vote for allowed tx`, () => { - let dataTx, treasury, accounts +describe(`[${process.pid}] factory: vote for allowed tx`, () => { + let dataTx, factory, accounts before(async () => { accounts = await setupAccounts() - treasury = accounts.treasury.address + factory = accounts.factory.address await broadcastAndWait(data({ additionalFee: 4e5, @@ -24,7 +24,7 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { } ], chainId - }, accounts.treasury.seed)) + }, accounts.factory.seed)) // set admins const setAdminsTx = data({ @@ -43,7 +43,7 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { } ], chainId - }, accounts.treasury.seed) + }, accounts.factory.seed) await broadcastAndWait(setAdminsTx) dataTx = data( @@ -52,7 +52,7 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { data: [{ key: 'foo', type: 'string', value: 'bar' }], chainId }, - accounts.treasury.seed + accounts.factory.seed ) }) @@ -63,7 +63,7 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { it('first votes should increment votes count', async () => { await broadcastAndWait(invokeScript( { - dApp: treasury, + dApp: factory, call: { function: 'voteForTxId', args: [{ type: 'string', value: dataTx.id }] @@ -74,7 +74,7 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { )) await broadcastAndWait(invokeScript( { - dApp: treasury, + dApp: factory, call: { function: 'voteForTxId', args: [{ type: 'string', value: dataTx.id }] @@ -84,7 +84,7 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { accounts.admin2.seed )) - const allowTxIdVotes = await api.addresses.data(treasury, { matches: encodeURIComponent(`%s%s%s__allowTxId__${dataTx.id}__.+`) }) + const allowTxIdVotes = await api.addresses.data(factory, { matches: encodeURIComponent(`%s%s%s__allowTxId__${dataTx.id}__.+`) }) expect(allowTxIdVotes).to.deep.include.members([ { @@ -103,7 +103,7 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { it('last vote should approve tx and remove voting data', async () => { const voteTx = invokeScript( { - dApp: treasury, + dApp: factory, call: { function: 'voteForTxId', args: [{ type: 'string', value: dataTx.id }] @@ -146,7 +146,7 @@ describe(`[${process.pid}] treasury: vote for allowed tx`, () => { it('vote should be failed if tx is already allowed', async () => { const voteTx = invokeScript( { - dApp: treasury, + dApp: factory, call: { function: 'voteForTxId', args: [{ type: 'string', value: dataTx.id }] From ae10cea32f88bc62d91e78df40eab8a98999ecc3 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Fri, 14 Jul 2023 16:12:12 +0300 Subject: [PATCH 118/143] Proxy Treasury test --- contracts/calculator/test/claim_waves.spec.js | 6 +- contracts/treasury/test/_setup.js | 23 +++---- contracts/treasury/test/transferWaves.spec.js | 68 +++++++++++++++++++ utils/api.js | 2 +- 4 files changed, 80 insertions(+), 19 deletions(-) create mode 100644 contracts/treasury/test/transferWaves.spec.js diff --git a/contracts/calculator/test/claim_waves.spec.js b/contracts/calculator/test/claim_waves.spec.js index 2f70e38..422bc99 100644 --- a/contracts/calculator/test/claim_waves.spec.js +++ b/contracts/calculator/test/claim_waves.spec.js @@ -48,7 +48,7 @@ describe(`[${process.pid}] calculator: claim waves`, () => { const finalizePaymentAmount = 198809133 const newTreasuryVolumeInWaves = 1100 * 1e8 - const pwrManagersBonusinWaves = 100 * 1e8 + const pwrManagersBonusInWaves = 100 * 1e8 const treasuryVolumeDiffAllocationCoef = 0 const [{ quantity }] = await api.assets.fetchDetails([lpAssetId]) await broadcastAndWait(invokeScript({ @@ -57,7 +57,7 @@ describe(`[${process.pid}] calculator: claim waves`, () => { function: 'finalize', args: [ { type: 'integer', value: newTreasuryVolumeInWaves }, - { type: 'integer', value: pwrManagersBonusinWaves }, + { type: 'integer', value: pwrManagersBonusInWaves }, { type: 'integer', value: treasuryVolumeDiffAllocationCoef } ] }, @@ -81,7 +81,7 @@ describe(`[${process.pid}] calculator: claim waves`, () => { const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') const profitRaw = newTreasuryVolumeInWaves - investedWavesAmount - const profit = profitRaw - pwrManagersBonusinWaves + const profit = profitRaw - pwrManagersBonusInWaves const expectedPrice = Math.floor((investedWavesAmount + profit) * scale8 / quantity) expect(price).to.equal(expectedPrice) expect(transfer).to.deep.equal({ diff --git a/contracts/treasury/test/_setup.js b/contracts/treasury/test/_setup.js index fdaa009..8fc4037 100644 --- a/contracts/treasury/test/_setup.js +++ b/contracts/treasury/test/_setup.js @@ -11,20 +11,13 @@ import { } from '../../../utils/api.js' const nonceLength = 3 -const ridePath = 'contracts/treasury' -const treasuryPath = format({ dir: ridePath, base: 'proxy_treasury.ride' }) +const proxyTreasuryPath = format({ dir: 'contracts/treasury', base: 'proxy_treasury.ride' }) -export const setupAccounts = async () => { +export const setup = async () => { const nonce = wc.random(nonceLength, 'Buffer').toString('hex') const names = [ - 'config', - 'votingResult', - 'treasury', - 'admin1', - 'admin2', - 'admin3', - 'admin4', - 'admin5', + 'factory', + 'proxyTreasury', 'user1' ] const accounts = Object.fromEntries(names.map((item) => { @@ -38,19 +31,19 @@ export const setupAccounts = async () => { }, baseSeed) await broadcastAndWait(massTransferTx) - await setScriptFromFile(treasuryPath, accounts.treasury.seed) + await setScriptFromFile(proxyTreasuryPath, accounts.proxyTreasury.seed) await broadcastAndWait(data({ additionalFee: 4e5, data: [ { - key: 'contract_voting_result', + key: '%s__factory', type: 'string', - value: accounts.votingResult.address + value: accounts.factory.address } ], chainId - }, accounts.config.seed)) + }, accounts.proxyTreasury.seed)) const accountsInfo = Object.entries(accounts) .map(([name, { seed, address }]) => [name, address]) diff --git a/contracts/treasury/test/transferWaves.spec.js b/contracts/treasury/test/transferWaves.spec.js new file mode 100644 index 0000000..a0b0921 --- /dev/null +++ b/contracts/treasury/test/transferWaves.spec.js @@ -0,0 +1,68 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { chainId, broadcastAndWait } from '../../../utils/api.js' +import { setup } from './_setup.js' +import { invokeScript } from '@waves/waves-transactions' +import { base58Decode, base64Encode } from '@waves/ts-lib-crypto' + +chai.use(chaiAsPromised) +const { expect } = chai + +describe(`[${process.pid}] proxy_treasury: transfer Waves`, () => { + let accounts + + before(async () => { + (accounts = await setup()) + }) + + it('user is rejected when try to transferWaves', async () => { + const transferAmount = 12345678 + const invokeTx = invokeScript({ + dApp: accounts.proxyTreasury.address, + call: { + function: 'transferWaves', + args: [ + { + type: 'binary', + value: base64Encode(base58Decode(accounts.user1.address)) + }, + { + type: 'integer', + value: transferAmount + } + ] + }, + chainId + }, accounts.user1.seed) + + return expect(broadcastAndWait(invokeTx)).to.be.rejectedWith('permission denied') + }) + + it('factory can successfully invoke transferWaves', async () => { + const transferAmount = 12345678 + const invokeTx = invokeScript({ + dApp: accounts.proxyTreasury.address, + call: { + function: 'transferWaves', + args: [ + { + type: 'binary', + value: base64Encode(base58Decode(accounts.user1.address)) + }, + { + type: 'integer', + value: transferAmount + } + ] + }, + chainId + }, accounts.factory.seed) + + const { stateChanges } = await broadcastAndWait(invokeTx) + return expect(stateChanges.transfers).to.be.deep.equal([{ + address: accounts.user1.address, + amount: transferAmount, + asset: null + }]) + }) +}) diff --git a/utils/api.js b/utils/api.js index bf75a07..2f88d02 100644 --- a/utils/api.js +++ b/utils/api.js @@ -10,7 +10,7 @@ export const { apiBase, chainId, baseSeed, daoSeed } = env(process.env.NETWORK) export const daoAddress = () => address(daoSeed, chainId) export const api = create(apiBase) -export const largeNumbeConvertHeader = { headers: { Accept: 'application/json;large-significand-format=string' } } +export const largeNumberConvertHeader = { headers: { Accept: 'application/json;large-significand-format=string' } } export const separator = '__' From dc6b1905fff1d88f95e85e7a8fda7b2710f4a732 Mon Sep 17 00:00:00 2001 From: Epic waves rider <108883923+epicwavesrider@users.noreply.github.com> Date: Thu, 20 Jul 2023 17:57:26 +0800 Subject: [PATCH 119/143] feat: multi collateral --- contracts/calculator/calculator.ride | 76 +++++--- .../calculator/test/claim_collateral.spec.js | 172 +++++++++++++++++ contracts/calculator/test/claim_waves.spec.js | 2 +- contracts/calculator/test/finalize.spec.js | 1 - .../test/finalizeMultiPayment.spec.js | 175 ++++++++++++++++++ contracts/factory/factory.ride | 31 +++- 6 files changed, 430 insertions(+), 27 deletions(-) create mode 100644 contracts/calculator/test/claim_collateral.spec.js create mode 100644 contracts/calculator/test/finalizeMultiPayment.spec.js diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index b572d43..ee5b373 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -24,6 +24,10 @@ func assetIdToString(assetId: ByteVector|Unit) = { } } +func stringToAssetId(s: String) = { + if (s == WAVES) then unit else s.fromBase58String() +} + func abs(n: Int) = { if (n < 0) then -n else n } @@ -55,6 +59,11 @@ func valueWithdrawalRequest(status: String, lpAssetAmount: Int, targetPeriod: In } ["%s%d%d%s", status, lpAssetAmount.toString(), targetPeriod.toString(), claimTxIdStr].makeString(SEP) } +func keyPeriodWithdrawalAssetIds(period: Int) = ["%s%d", "periodReward", period.toString()].makeString(SEP) +func keyPeriodWithdrawalAmounts(period: Int) = ["%s%d", "periodRewardAmount", period.toString()].makeString(SEP) +let keyMinHeightForWithdraw = ["%s", "minHeightForWithdraw"].makeString(SEP) +let keyMaxHeightForWithdraw = ["%s", "maxHeightForWithdraw"].makeString(SEP) + func parseWithdrawalRequestValueOrFail(s: String) = { let parts = s.split(SEP) if (parts.size() == 5) then { @@ -90,7 +99,9 @@ let proxyTreasuryAddressOption = match factoryAddressOption { } case _: Unit => unit } -let proxyTreasuryAddressOrFail = proxyTreasuryAddressOption.valueOrErrorMessage(wrapErr("invalid proxy treasury address")) +let proxyTreasuryAddressOrFail = proxyTreasuryAddressOption.valueOrErrorMessage( + wrapErr("invalid proxy treasury address") +) let mainTreasuryAddressOption = match factoryAddressOption { case a: Address => match a.getString(keyMainTreasuryAddress()) { @@ -191,7 +202,14 @@ func finalizeINTERNAL( let finalInvestedWavesAmount = investedWavesAmountNew - paymentAmountMin let lpAssetFinalQuantity = lpAssetQuantity - lpAssetAmountToBurn - (paymentAmountMin, finalInvestedWavesAmount, donatedWavesAmountNew, newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity) + ( + paymentAmountMin, + finalInvestedWavesAmount, + donatedWavesAmountNew, + newPrice, + lpAssetAmountToBurn, + lpAssetFinalQuantity + ) } @Callable(i) @@ -259,7 +277,7 @@ func finalize( # Finalize calcualtions let ( - paymentAmountMin, + paymentAmountMin, finalInvestedWavesAmount, donatedWavesAmountNew, newPrice, @@ -268,25 +286,26 @@ func finalize( ) = finalizeINTERNAL(newTreasuryVolumeInWaves, pwrManagersBonusInWaves, treasuryVolumeDiffAllocationCoef) let newPeriod = currentPeriodOrFail + 1 - let paymentOption = if (i.payments.size() > 0) then i.payments[0] else unit - let paymentAmount = paymentOption.value().amount - let paymentAssetId = paymentOption.value().assetId - strict checkPayment = if ( - paymentAmountMin == 0 - || ( - paymentOption != unit - && paymentAssetId == unit - && paymentAmount == paymentAmountMin - ) - ) then true else throwErr("invalid payments, payment amount should be: " + paymentAmountMin.toString()) - - let actions = if (paymentOption != unit) then [ - ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId) - ] else nil + + func addNewAction(actions: (List[ScriptTransfer], String, String), payment: AttachedPayment) = { + let (scriptTransfers, assetIdsString, amountsString) = actions + let paymentAmount = payment.amount + let paymentAssetId = payment.assetId + + let newAssetIdsString = "%s" + [assetIdsString, paymentAssetId.assetIdToString()].makeString(SEP) + let newAmountsString = "%d" + [amountsString, paymentAmount.toString()].makeString(SEP) + let newScriptTransfer = ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId) + + (scriptTransfers :+ newScriptTransfer, newAssetIdsString, newAmountsString) + } + + let (scriptTransfers, AssetIds, Amounts) = FOLD<10>(i.payments, ([], "", ""), addNewAction) let factoryActions = [ # write power manager bonus - factoryAddressOrFail.invoke("integerEntry", [keyPowerManagerBonus(currentPeriodOrFail), pwrManagersBonusInWaves], []), + factoryAddressOrFail.invoke( + "integerEntry", [keyPowerManagerBonus(currentPeriodOrFail), pwrManagersBonusInWaves], [] + ), # update period factoryAddressOrFail.invoke("integerEntry", [keyCurrentPeriod(), newPeriod], []), # update price @@ -298,10 +317,13 @@ func finalize( # new invested amount factoryAddressOrFail.invoke("integerEntry", [keyInvested(unit), finalInvestedWavesAmount], []), # new donated amount - factoryAddressOrFail.invoke("integerEntry", [keyDonated(unit), donatedWavesAmountNew], []) + factoryAddressOrFail.invoke("integerEntry", [keyDonated(unit), donatedWavesAmountNew], []), + # new period treasury + factoryAddressOrFail.invoke("stringEntry", [keyPeriodWithdrawalAssetIds(newPeriod), AssetIds], []), + factoryAddressOrFail.invoke("stringEntry", [keyPeriodWithdrawalAmounts(newPeriod), Amounts], []) ] - (actions, factoryActions) + (scriptTransfers, factoryActions) } # Returned values: @@ -454,7 +476,7 @@ func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { } @Callable(i) -func claimWaves(userAddressBytes: ByteVector, txId: ByteVector) = { +func claimCollateral(userAddressBytes: ByteVector, txId: ByteVector) = { strict checkCaller = i.onlyFactory() let userAddress = Address(userAddressBytes) let currentPeriodOrFail = @@ -476,7 +498,15 @@ func claimWaves(userAddressBytes: ByteVector, txId: ByteVector) = { keyWithdrawalRequest(userAddress, txId), valueWithdrawalRequest(FINISHED, lpAssetAmount, targetPeriod, i.transactionId) ], []), - factoryAddressOrFail.invoke("transferWaves", [userAddressBytes, amount], []) + + let assetsList = factoryAddressOrFail.getStringValue( + keyPeriodWithdrawalAssetIds(currentPeriodOrFail) + ).split_51C(SEP).removeByIndex(0) + let amountsList = factoryAddressOrFail.getStringValue( + keyPeriodWithdrawalAmounts(currentPeriodOrFail) + ).split_51C(SEP).removeByIndex(0) + + factoryAddressOrFail.invoke("transferAssets", [userAddressBytes, assetsList, amountsList], []) ] (nil, factoryActions) } diff --git a/contracts/calculator/test/claim_collateral.spec.js b/contracts/calculator/test/claim_collateral.spec.js new file mode 100644 index 0000000..860e5ed --- /dev/null +++ b/contracts/calculator/test/claim_collateral.spec.js @@ -0,0 +1,172 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { api, chainId, broadcastAndWait, baseSeed } from '../../../utils/api.js' +import { setup } from './_setup.js' +import { invokeScript, transfer, issue } from '@waves/waves-transactions' + +chai.use(chaiAsPromised) +const { expect } = chai + +const scale8 = 1e8 + +describe(`[${process.pid}] calculator: claim collateral`, () => { + let accounts, lpAssetId, investedWavesAmount + + before(async () => { + const { height } = await api.blocks.fetchHeight() + investedWavesAmount = 500 * 1e8; + ({ accounts, lpAssetId } = await setup({ + investedWavesAmount, + nextBlockToProcess: height, + periodLength: 1 + })) + + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'processBlocks', args: [] }, + chainId + }, accounts.user1.seed)) + + const paymentAmount = 1e8 + investedWavesAmount += paymentAmount + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'invest', args: [] }, + payment: [{ assetId: null, amount: paymentAmount }], + chainId + }, accounts.user1.seed)) + }) + + it('user should successfully claim assets after finalization', async () => { + const paymentAmount = 1e8 + + const { id: firstAssetId } = await broadcastAndWait( + issue( + { + name: "FirstAsset", + description: "", + quantity: 10e8, + decimals: 8, + reissuable: true, + chainId, + }, + baseSeed + ) + ); + + await broadcastAndWait(transfer({ + recipient: accounts.mainTreasury.address, + amount: 10e8, + assetId: firstAssetId, + additionalFee: 4e5, + }, baseSeed)); + + const { id: secondAssetId } = await broadcastAndWait( + issue( + { + name: "SecondAsset", + description: "", + quantity: 10e8, + decimals: 8, + reissuable: true, + chainId, + }, + baseSeed + ) + ); + + await broadcastAndWait(transfer({ + recipient: accounts.mainTreasury.address, + amount: 10e8, + assetId: secondAssetId, + additionalFee: 4e5, + }, baseSeed)); + + const { id: thirdAssetId } = await broadcastAndWait( + issue( + { + name: "ThirdAsset", + description: "", + quantity: 10e8, + decimals: 8, + reissuable: true, + chainId, + }, + baseSeed + ) + ); + + await broadcastAndWait(transfer({ + recipient: accounts.mainTreasury.address, + amount: 10e8, + assetId: thirdAssetId, + additionalFee: 4e5, + }, baseSeed)); + + const { id: withdrawTxId } = await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'withdraw', args: [] }, + payment: [{ assetId: lpAssetId, amount: paymentAmount }], + chainId + }, accounts.user1.seed)) + + const newTreasuryVolumeInWaves = 1100 * 1e8 + const pwrManagersBonusInWaves = 100 * 1e8 + const treasuryVolumeDiffAllocationCoef = 0 + const [{ quantity }] = await api.assets.fetchDetails([lpAssetId]) + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { + function: 'finalize', + args: [ + { type: 'integer', value: newTreasuryVolumeInWaves }, + { type: 'integer', value: pwrManagersBonusInWaves }, + { type: 'integer', value: treasuryVolumeDiffAllocationCoef } + ] + }, + payment: [ + { assetId: firstAssetId, amount: paymentAmount }, + { assetId: secondAssetId, amount: paymentAmount }, + { assetId: thirdAssetId, amount: paymentAmount }, + ], + chainId, + additionalFee: 4e5 + }, accounts.mainTreasury.seed)) + + const { stateChanges } = await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { + function: 'claimCollateral', + args: [ + { type: 'string', value: withdrawTxId } + ] + }, + chainId + }, accounts.user1.seed)) + + const stateChangesTransfers = stateChanges.invokes[0].stateChanges.invokes[1].stateChanges.transfers + + const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') + const profitRaw = newTreasuryVolumeInWaves - investedWavesAmount + const profit = profitRaw - pwrManagersBonusInWaves + const expectedPrice = Math.floor((investedWavesAmount + profit) * scale8 / quantity) + expect(price).to.equal(expectedPrice) + expect(stateChangesTransfers).to.deep.equal([ + { + address: accounts.user1.address, + asset: firstAssetId, + amount: paymentAmount + }, + { + address: accounts.user1.address, + asset: secondAssetId, + amount: paymentAmount + }, + { + address: accounts.user1.address, + asset: thirdAssetId, + amount: paymentAmount + } + ]) + }) +}) diff --git a/contracts/calculator/test/claim_waves.spec.js b/contracts/calculator/test/claim_waves.spec.js index 422bc99..9fd5596 100644 --- a/contracts/calculator/test/claim_waves.spec.js +++ b/contracts/calculator/test/claim_waves.spec.js @@ -69,7 +69,7 @@ describe(`[${process.pid}] calculator: claim waves`, () => { const { stateChanges } = await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, call: { - function: 'claimWaves', + function: 'claimCollateral', args: [ { type: 'string', value: withdrawTxId } ] diff --git a/contracts/calculator/test/finalize.spec.js b/contracts/calculator/test/finalize.spec.js index 0666afb..c3fab1f 100644 --- a/contracts/calculator/test/finalize.spec.js +++ b/contracts/calculator/test/finalize.spec.js @@ -113,7 +113,6 @@ describe(`[${process.pid}] calculator: finalize`, () => { } const expectedPrice = Math.floor((totalInvestAmount + investProfit) * scale8 / quantity) - console.log(price / scale8, expectedPrice / scale8) expect(price, 'invalid price').to.equal(expectedPrice) const expectedFactoryBalance = factoryBalanceBefore + paymentAmount expect(factoryBalanceAfter, 'invalid factory balance').to.equal(expectedFactoryBalance) diff --git a/contracts/calculator/test/finalizeMultiPayment.spec.js b/contracts/calculator/test/finalizeMultiPayment.spec.js new file mode 100644 index 0000000..09ab8fa --- /dev/null +++ b/contracts/calculator/test/finalizeMultiPayment.spec.js @@ -0,0 +1,175 @@ +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; +import { api, chainId, broadcastAndWait, baseSeed } from "../../../utils/api.js"; +import { setup } from "./_setup.js"; +import { invokeScript, transfer, issue } from "@waves/waves-transactions"; + +chai.use(chaiAsPromised); +const { expect } = chai; + +const scale8 = 1e8; + +describe(`[${process.pid}] calculator: finalizeMultiPayment`, () => { + let accounts, lpAssetId; + const paymentAmount = 1; + const periodLength = 1; + const periodReward = 2 * 1e8; + const newTreasuryVolumeInWaves = 10000 * 1e8; + const pwrManagersBonusInWaves = 700 * 1e8; + const treasuryVolumeDiffAllocationCoef = -0.5; + const initialInvestInWaves = 5000 * 1e8; + const initialDonatedInWaves = 3000 * 1e8; + const blockProcessingReward = 0.015 * 1e8; + + before(async () => { + const { height } = await api.blocks.fetchHeight(); + ({ accounts, lpAssetId } = await setup({ + nextBlockToProcess: height, + periodLength, + blockProcessingReward, + investedWavesAmount: initialInvestInWaves, + donatedWavesAmount: initialDonatedInWaves, + })); + }); + + it("period should be finalized", async () => { + const { id: firstAssetId } = await broadcastAndWait( + issue( + { + name: "FirstAsset", + description: "", + quantity: 10e8, + decimals: 8, + reissuable: true, + chainId, + }, + baseSeed + ) + ); + + await broadcastAndWait(transfer({ + recipient: accounts.mainTreasury.address, + amount: 10e8, + assetId: firstAssetId, + additionalFee: 4e5, + }, baseSeed)); + + const { id: secondAssetId } = await broadcastAndWait( + issue( + { + name: "SecondAsset", + description: "", + quantity: 10e8, + decimals: 8, + reissuable: true, + chainId, + }, + baseSeed + ) + ); + + await broadcastAndWait(transfer({ + recipient: accounts.mainTreasury.address, + amount: 10e8, + assetId: secondAssetId, + additionalFee: 4e5, + }, baseSeed)); + + const { id: thirdAssetId } = await broadcastAndWait( + issue( + { + name: "ThirdAsset", + description: "", + quantity: 10e8, + decimals: 8, + reissuable: true, + chainId, + }, + baseSeed + ) + ); + + await broadcastAndWait(transfer({ + recipient: accounts.mainTreasury.address, + amount: 10e8, + assetId: thirdAssetId, + additionalFee: 4e5, + }, baseSeed)); + + await broadcastAndWait( + invokeScript( + { + dApp: accounts.factory.address, + call: { function: "processBlocks", args: [] }, + chainId, + }, + accounts.user1.seed + ) + ); + + const { balance: factoryFirstAssetBalanceBefore } = await api.assets.fetchBalanceAddressAssetId( + accounts.factory.address, + firstAssetId + ); + + const { balance: factorySecondAssetBalanceBefore } = await api.assets.fetchBalanceAddressAssetId( + accounts.factory.address, + secondAssetId + ); + + const { balance: factoryThirdAssetBalanceBefore } = await api.assets.fetchBalanceAddressAssetId( + accounts.factory.address, + thirdAssetId + ); + + await broadcastAndWait( + invokeScript( + { + dApp: accounts.factory.address, + call: { + function: "finalize", + args: [ + { type: "integer", value: newTreasuryVolumeInWaves }, + { type: "integer", value: pwrManagersBonusInWaves }, + { + type: "integer", + value: treasuryVolumeDiffAllocationCoef * scale8, + }, + ], + }, + payment: [ + { assetId: firstAssetId, amount: paymentAmount }, + { assetId: secondAssetId, amount: paymentAmount }, + { assetId: thirdAssetId, amount: paymentAmount }, + ], + chainId, + additionalFee: 4e5, + }, + accounts.mainTreasury.seed + ) + ); + + const { balance: factoryFirstAssetBalanceAfter } = await api.assets.fetchBalanceAddressAssetId( + accounts.factory.address, + secondAssetId + ); + + const { balance: factorySecondAssetBalanceAfter } = await api.assets.fetchBalanceAddressAssetId( + accounts.factory.address, + secondAssetId + ); + + const { balance: factoryThirdAssetBalanceAfter } = await api.assets.fetchBalanceAddressAssetId( + accounts.factory.address, + secondAssetId + ); + + const expectedFactoryFirstAssetBalance = factoryFirstAssetBalanceBefore + paymentAmount; + const expectedFactorySecondAssetBalance = factorySecondAssetBalanceBefore + paymentAmount; + const expectedFactoryThirdAssetBalance = factoryThirdAssetBalanceBefore + paymentAmount; + + expect(factoryFirstAssetBalanceAfter, 'invalid factory first asset balance').to.equal(expectedFactoryFirstAssetBalance); + expect(factorySecondAssetBalanceAfter, 'invalid factory second asset balance').to.equal(expectedFactorySecondAssetBalance); + expect(factoryThirdAssetBalanceAfter, 'invalid factory third asset balance').to.equal(expectedFactoryThirdAssetBalance); + }); +}); diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 5cc7948..5eebbc7 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -3,6 +3,7 @@ {-# SCRIPT_TYPE ACCOUNT #-} let SEP = "__" +let WAVES = "WAVES" let contractFilename = "factory.ride" func wrapErr(s: String) = { @@ -13,6 +14,10 @@ func throwErr(s: String) = { throw(wrapErr(s)) } +func stringToAssetId(s: String) = { + if (s == WAVES) then unit else s.fromBase58String() +} + ###################### # MULTISIG FUNCTIONS # ###################### @@ -219,6 +224,28 @@ func burn(amount: Int) = func transferAsset(recepientBytes: ByteVector, amount: Int, assetId: ByteVector) = if (i.onlyCalculator()) then ([ScriptTransfer(Address(recepientBytes), amount, assetId)], amount) else ([], unit) +@Callable(i) +func transferAssets(recepientBytes: ByteVector, assetsList: List[String], amountsList: List[String]) = { + if (i.onlyCalculator()) then { + func addNewTransfer(accum: (List[ScriptTransfer], Int), nextAssetId: String) = { + let (transfers, j) = accum + + let newTransfer = ScriptTransfer( + Address(recepientBytes), + amountsList[j].parseIntValue(), + assetsList[j].stringToAssetId() + ) + let updatedTransfers = transfers :+ newTransfer + (updatedTransfers, j + 1) + } + + let (assetsTransfers, _lastIndex) = FOLD<10>(assetsList, ([], 0), addNewTransfer) + (assetsTransfers, unit) + } else { + ([], unit) + } +} + @Callable(i) func transferWaves(recepientBytes: ByteVector, amount: Int) = if (i.onlyCalculator()) then ([ScriptTransfer(Address(recepientBytes), amount, unit)], amount) else ([], unit) @@ -282,8 +309,8 @@ func claimLP() = (nil, calculatorAddressOrFail.reentrantInvoke("claimLP", [i.caller.bytes], i.payments)) @Callable(i) -func claimWaves(txIdStr: String) = - (nil, calculatorAddressOrFail.reentrantInvoke("claimWaves", [i.caller.bytes, txIdStr.fromBase58String()], i.payments)) +func claimCollateral(txIdStr: String) = + (nil, calculatorAddressOrFail.reentrantInvoke("claimCollateral", [i.caller.bytes, txIdStr.fromBase58String()], i.payments)) @Callable(i) func invest() = From 1ea2838cba7eeb390c62554b55c45edbe16974e8 Mon Sep 17 00:00:00 2001 From: Epic waves rider <108883923+epicwavesrider@users.noreply.github.com> Date: Thu, 20 Jul 2023 18:42:03 +0800 Subject: [PATCH 120/143] feat: add lint npm run-script --- .../calculator/test/claim_collateral.spec.js | 38 ++--- .../test/finalizeMultiPayment.spec.js | 139 +++++++++--------- package.json | 4 +- 3 files changed, 91 insertions(+), 90 deletions(-) diff --git a/contracts/calculator/test/claim_collateral.spec.js b/contracts/calculator/test/claim_collateral.spec.js index 860e5ed..dd726a1 100644 --- a/contracts/calculator/test/claim_collateral.spec.js +++ b/contracts/calculator/test/claim_collateral.spec.js @@ -43,65 +43,65 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { const { id: firstAssetId } = await broadcastAndWait( issue( { - name: "FirstAsset", - description: "", + name: 'FirstAsset', + description: '', quantity: 10e8, decimals: 8, reissuable: true, - chainId, + chainId }, baseSeed ) - ); + ) await broadcastAndWait(transfer({ recipient: accounts.mainTreasury.address, amount: 10e8, assetId: firstAssetId, - additionalFee: 4e5, - }, baseSeed)); + additionalFee: 4e5 + }, baseSeed)) const { id: secondAssetId } = await broadcastAndWait( issue( { - name: "SecondAsset", - description: "", + name: 'SecondAsset', + description: '', quantity: 10e8, decimals: 8, reissuable: true, - chainId, + chainId }, baseSeed ) - ); + ) await broadcastAndWait(transfer({ recipient: accounts.mainTreasury.address, amount: 10e8, assetId: secondAssetId, - additionalFee: 4e5, - }, baseSeed)); + additionalFee: 4e5 + }, baseSeed)) const { id: thirdAssetId } = await broadcastAndWait( issue( { - name: "ThirdAsset", - description: "", + name: 'ThirdAsset', + description: '', quantity: 10e8, decimals: 8, reissuable: true, - chainId, + chainId }, baseSeed ) - ); + ) await broadcastAndWait(transfer({ recipient: accounts.mainTreasury.address, amount: 10e8, assetId: thirdAssetId, - additionalFee: 4e5, - }, baseSeed)); + additionalFee: 4e5 + }, baseSeed)) const { id: withdrawTxId } = await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, @@ -127,7 +127,7 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { payment: [ { assetId: firstAssetId, amount: paymentAmount }, { assetId: secondAssetId, amount: paymentAmount }, - { assetId: thirdAssetId, amount: paymentAmount }, + { assetId: thirdAssetId, amount: paymentAmount } ], chainId, additionalFee: 4e5 diff --git a/contracts/calculator/test/finalizeMultiPayment.spec.js b/contracts/calculator/test/finalizeMultiPayment.spec.js index 09ab8fa..0364798 100644 --- a/contracts/calculator/test/finalizeMultiPayment.spec.js +++ b/contracts/calculator/test/finalizeMultiPayment.spec.js @@ -1,175 +1,174 @@ -import chai from "chai"; -import chaiAsPromised from "chai-as-promised"; -import { api, chainId, broadcastAndWait, baseSeed } from "../../../utils/api.js"; -import { setup } from "./_setup.js"; -import { invokeScript, transfer, issue } from "@waves/waves-transactions"; +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { api, chainId, broadcastAndWait, baseSeed } from '../../../utils/api.js' +import { setup } from './_setup.js' +import { invokeScript, transfer, issue } from '@waves/waves-transactions' -chai.use(chaiAsPromised); -const { expect } = chai; +chai.use(chaiAsPromised) +const { expect } = chai -const scale8 = 1e8; +const scale8 = 1e8 describe(`[${process.pid}] calculator: finalizeMultiPayment`, () => { - let accounts, lpAssetId; - const paymentAmount = 1; - const periodLength = 1; - const periodReward = 2 * 1e8; - const newTreasuryVolumeInWaves = 10000 * 1e8; - const pwrManagersBonusInWaves = 700 * 1e8; - const treasuryVolumeDiffAllocationCoef = -0.5; - const initialInvestInWaves = 5000 * 1e8; - const initialDonatedInWaves = 3000 * 1e8; - const blockProcessingReward = 0.015 * 1e8; + let accounts + const paymentAmount = 1 + const periodLength = 1 + const newTreasuryVolumeInWaves = 10000 * 1e8 + const pwrManagersBonusInWaves = 700 * 1e8 + const treasuryVolumeDiffAllocationCoef = -0.5 + const initialInvestInWaves = 5000 * 1e8 + const initialDonatedInWaves = 3000 * 1e8 + const blockProcessingReward = 0.015 * 1e8 before(async () => { const { height } = await api.blocks.fetchHeight(); - ({ accounts, lpAssetId } = await setup({ + ({ accounts } = await setup({ nextBlockToProcess: height, periodLength, blockProcessingReward, investedWavesAmount: initialInvestInWaves, - donatedWavesAmount: initialDonatedInWaves, - })); - }); + donatedWavesAmount: initialDonatedInWaves + })) + }) - it("period should be finalized", async () => { + it('period should be finalized', async () => { const { id: firstAssetId } = await broadcastAndWait( issue( { - name: "FirstAsset", - description: "", + name: 'FirstAsset', + description: '', quantity: 10e8, decimals: 8, reissuable: true, - chainId, + chainId }, baseSeed ) - ); + ) await broadcastAndWait(transfer({ recipient: accounts.mainTreasury.address, amount: 10e8, assetId: firstAssetId, - additionalFee: 4e5, - }, baseSeed)); + additionalFee: 4e5 + }, baseSeed)) const { id: secondAssetId } = await broadcastAndWait( issue( { - name: "SecondAsset", - description: "", + name: 'SecondAsset', + description: '', quantity: 10e8, decimals: 8, reissuable: true, - chainId, + chainId }, baseSeed ) - ); + ) await broadcastAndWait(transfer({ recipient: accounts.mainTreasury.address, amount: 10e8, assetId: secondAssetId, - additionalFee: 4e5, - }, baseSeed)); + additionalFee: 4e5 + }, baseSeed)) const { id: thirdAssetId } = await broadcastAndWait( issue( { - name: "ThirdAsset", - description: "", + name: 'ThirdAsset', + description: '', quantity: 10e8, decimals: 8, reissuable: true, - chainId, + chainId }, baseSeed ) - ); + ) await broadcastAndWait(transfer({ recipient: accounts.mainTreasury.address, amount: 10e8, assetId: thirdAssetId, - additionalFee: 4e5, - }, baseSeed)); + additionalFee: 4e5 + }, baseSeed)) await broadcastAndWait( invokeScript( { dApp: accounts.factory.address, - call: { function: "processBlocks", args: [] }, - chainId, + call: { function: 'processBlocks', args: [] }, + chainId }, accounts.user1.seed ) - ); + ) const { balance: factoryFirstAssetBalanceBefore } = await api.assets.fetchBalanceAddressAssetId( accounts.factory.address, firstAssetId - ); + ) const { balance: factorySecondAssetBalanceBefore } = await api.assets.fetchBalanceAddressAssetId( accounts.factory.address, secondAssetId - ); + ) const { balance: factoryThirdAssetBalanceBefore } = await api.assets.fetchBalanceAddressAssetId( accounts.factory.address, thirdAssetId - ); + ) await broadcastAndWait( invokeScript( { dApp: accounts.factory.address, call: { - function: "finalize", + function: 'finalize', args: [ - { type: "integer", value: newTreasuryVolumeInWaves }, - { type: "integer", value: pwrManagersBonusInWaves }, + { type: 'integer', value: newTreasuryVolumeInWaves }, + { type: 'integer', value: pwrManagersBonusInWaves }, { - type: "integer", - value: treasuryVolumeDiffAllocationCoef * scale8, - }, - ], + type: 'integer', + value: treasuryVolumeDiffAllocationCoef * scale8 + } + ] }, payment: [ { assetId: firstAssetId, amount: paymentAmount }, { assetId: secondAssetId, amount: paymentAmount }, - { assetId: thirdAssetId, amount: paymentAmount }, + { assetId: thirdAssetId, amount: paymentAmount } ], chainId, - additionalFee: 4e5, + additionalFee: 4e5 }, accounts.mainTreasury.seed ) - ); + ) const { balance: factoryFirstAssetBalanceAfter } = await api.assets.fetchBalanceAddressAssetId( accounts.factory.address, secondAssetId - ); + ) const { balance: factorySecondAssetBalanceAfter } = await api.assets.fetchBalanceAddressAssetId( accounts.factory.address, secondAssetId - ); + ) const { balance: factoryThirdAssetBalanceAfter } = await api.assets.fetchBalanceAddressAssetId( accounts.factory.address, secondAssetId - ); - - const expectedFactoryFirstAssetBalance = factoryFirstAssetBalanceBefore + paymentAmount; - const expectedFactorySecondAssetBalance = factorySecondAssetBalanceBefore + paymentAmount; - const expectedFactoryThirdAssetBalance = factoryThirdAssetBalanceBefore + paymentAmount; - - expect(factoryFirstAssetBalanceAfter, 'invalid factory first asset balance').to.equal(expectedFactoryFirstAssetBalance); - expect(factorySecondAssetBalanceAfter, 'invalid factory second asset balance').to.equal(expectedFactorySecondAssetBalance); - expect(factoryThirdAssetBalanceAfter, 'invalid factory third asset balance').to.equal(expectedFactoryThirdAssetBalance); - }); -}); + ) + + const expectedFactoryFirstAssetBalance = factoryFirstAssetBalanceBefore + paymentAmount + const expectedFactorySecondAssetBalance = factorySecondAssetBalanceBefore + paymentAmount + const expectedFactoryThirdAssetBalance = factoryThirdAssetBalanceBefore + paymentAmount + + expect(factoryFirstAssetBalanceAfter, 'invalid factory first asset balance').to.equal(expectedFactoryFirstAssetBalance) + expect(factorySecondAssetBalanceAfter, 'invalid factory second asset balance').to.equal(expectedFactorySecondAssetBalance) + expect(factoryThirdAssetBalanceAfter, 'invalid factory third asset balance').to.equal(expectedFactoryThirdAssetBalance) + }) +}) diff --git a/package.json b/package.json index 4c93326..4278ec1 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "version": "1.0.0", "description": "", "scripts": { - "test": "NETWORK=custom mocha" + "test": "NETWORK=custom mocha", + "lint": "eslint . --ext .mjs --ext .js", + "lint-fix": "eslint . --ext .mjs --ext .js --fix" }, "keywords": [], "author": "", From 36ad554dbe1c4e55bcbbe88475242173c9e90132 Mon Sep 17 00:00:00 2001 From: Epic waves rider <108883923+epicwavesrider@users.noreply.github.com> Date: Mon, 31 Jul 2023 21:00:41 +0800 Subject: [PATCH 121/143] feat: business treasury --- contracts/calculator/calculator.ride | 39 ++++++-- contracts/calculator/test/_setup.js | 2 + .../invest_with_business_treasury.spec.js | 53 ++++++++++ ...cess_blocks_with_business_treasury.spec.js | 96 +++++++++++++++++++ 4 files changed, 184 insertions(+), 6 deletions(-) create mode 100644 contracts/calculator/test/invest_with_business_treasury.spec.js create mode 100644 contracts/calculator/test/process_blocks_with_business_treasury.spec.js diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index ee5b373..abe2eb3 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -37,6 +37,8 @@ func keyManagerPublicKey() = ["%s", "managerPublicKey"].makeString(SEP) func keyLpAssetId() = ["%s", "lpAssetId"].makeString(SEP) func keyProxyTreasuryAddress() = ["%s", "proxyTreasury"].makeString(SEP) func keyMainTreasuryAddress() = ["%s", "mainTreasury"].makeString(SEP) +func keyBusinessTreasuryAddress() = ["%s", "businessTreasury"].makeString(SEP) +func keyBusinessTreasuryPart() = ["%s", "businessTreasuryPart"].makeString(SEP) func keyInvested(assetId: ByteVector|Unit) = ["%s%s", "invested", assetIdToString(assetId)].makeString(SEP) func keyDonated(assetId: ByteVector|Unit) = ["%s%s", "donated", assetIdToString(assetId)].makeString(SEP) func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toString()].makeString(SEP) @@ -61,8 +63,6 @@ func valueWithdrawalRequest(status: String, lpAssetAmount: Int, targetPeriod: In } func keyPeriodWithdrawalAssetIds(period: Int) = ["%s%d", "periodReward", period.toString()].makeString(SEP) func keyPeriodWithdrawalAmounts(period: Int) = ["%s%d", "periodRewardAmount", period.toString()].makeString(SEP) -let keyMinHeightForWithdraw = ["%s", "minHeightForWithdraw"].makeString(SEP) -let keyMaxHeightForWithdraw = ["%s", "maxHeightForWithdraw"].makeString(SEP) func parseWithdrawalRequestValueOrFail(s: String) = { let parts = s.split(SEP) @@ -110,7 +110,19 @@ let mainTreasuryAddressOption = match factoryAddressOption { } case _: Unit => unit } + +let businessTreasuryAddressOption = match factoryAddressOption { + case a: Address => match a.getString(keyBusinessTreasuryAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit + } + case _: Unit => unit +} + let mainTreasuryAddressOrFail = mainTreasuryAddressOption.valueOrErrorMessage(wrapErr("invalid main treasury address")) +let businessTreasuryAddressOrFail = businessTreasuryAddressOption.valueOrErrorMessage( + wrapErr("invalid business treasury address") +) func getManagerPublicKeyOrUnit() = { match (factoryAddressOption) { @@ -386,17 +398,26 @@ func invest(userAddressBytes: ByteVector) = { let (paymentAmount, paymentAssetId) = if (payment.assetId == unit && payment.amount > 0) then { (payment.amount, payment.assetId) } else throwErr("invalid payment amount") - let lpAssetAmount = if (currentPriceOrFail > 0) then fraction(paymentAmount, SCALE8, currentPriceOrFail) else 0 + + let treasuryPart = factoryAddressOrFail.getInteger(keyBusinessTreasuryPart()).valueOrElse(0) + let paymentsWithoutTreasuryPart = fraction(paymentAmount, SCALE8 - treasuryPart, SCALE8) + + let lpAssetAmount = if (currentPriceOrFail > 0) then fraction( + paymentsWithoutTreasuryPart, + SCALE8, + currentPriceOrFail + ) else 0 let invested = factoryAddressOrFail.getInteger(keyInvested(unit)).valueOrElse(0) let actions = [ - ScriptTransfer(mainTreasuryAddressOrFail, paymentAmount, paymentAssetId) + ScriptTransfer(mainTreasuryAddressOrFail, paymentsWithoutTreasuryPart, paymentAssetId), + ScriptTransfer(businessTreasuryAddressOrFail, treasuryPart, paymentAssetId) ] let factoryActions = [ # increase invested amount factoryAddressOrFail.invoke("integerEntry", [ - keyInvested(unit), invested + paymentAmount + keyInvested(unit), invested + paymentsWithoutTreasuryPart ], []), factoryAddressOrFail.invoke("reissue", [lpAssetAmount], []), factoryAddressOrFail.invoke("transferAsset", [ @@ -604,7 +625,9 @@ func processBlocks(userAddressBytes: ByteVector) = { ] strict (lpAssetAmountTotal, rewardAmountTotal) = FOLD<40>(list, (0, 0), map) - let rewardToMainTreasuryAmount = rewardAmountTotal - blockProcessingReward + let businessTreasuryPart = factoryAddressOrFail.getInteger(keyBusinessTreasuryPart()).valueOrElse(0) + let rewardToBusinessTreasuryAmount = fraction(rewardAmountTotal, businessTreasuryPart, SCALE8) + let rewardToMainTreasuryAmount = rewardAmountTotal - rewardToBusinessTreasuryAmount - blockProcessingReward let invested = factoryAddressOrFail.getInteger(keyInvested(unit)).valueOrElse(0) strict actions = [ @@ -623,6 +646,10 @@ func processBlocks(userAddressBytes: ByteVector) = { userAddressBytes, blockProcessingReward ], []), + factoryAddressOrFail.invoke("transferFromProxyTreasury", [ + businessTreasuryAddressOrFail.bytes, + rewardToBusinessTreasuryAmount + ], []), # increase invested amount factoryAddressOrFail.invoke("integerEntry", [ keyInvested(unit), invested + rewardToMainTreasuryAmount diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index 7ce4605..536dce1 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -34,6 +34,7 @@ export const setup = async ({ 'calculator', 'treasury', 'mainTreasury', + 'businessTreasury', 'user1' ] const accounts = Object.fromEntries(names.map((item) => { @@ -96,6 +97,7 @@ export const setup = async ({ { key: '%s__calculator', type: 'string', value: accounts.calculator.address }, { key: '%s__proxyTreasury', type: 'string', value: daoAddress() }, { key: '%s__mainTreasury', type: 'string', value: accounts.mainTreasury.address }, + { key: '%s__businessTreasury', type: 'string', value: accounts.businessTreasury.address }, { key: '%s__lpAssetId', type: 'string', value: lpAssetId }, { key: '%s__nextBlockToProcess', type: 'integer', value: nextBlockToProcess }, { key: '%s__currentPeriod', type: 'integer', value: currentPeriod }, diff --git a/contracts/calculator/test/invest_with_business_treasury.spec.js b/contracts/calculator/test/invest_with_business_treasury.spec.js new file mode 100644 index 0000000..c9ef5d6 --- /dev/null +++ b/contracts/calculator/test/invest_with_business_treasury.spec.js @@ -0,0 +1,53 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { api, chainId, broadcastAndWait } from '../../../utils/api.js' +import { setup } from './_setup.js' +import { invokeScript, data } from '@waves/waves-transactions' + +chai.use(chaiAsPromised) +const { expect } = chai + +describe(`[${process.pid}] calculator: invest2`, () => { + let accounts, lpAssetId, price + + const businessTreasuryPartValue = 1e8 / 20 + + before(async () => { + ({ accounts, lpAssetId, price } = await setup()) + + await broadcastAndWait( + data( + { + additionalFee: 4e5, + data: [ + { + key: '%s__businessTreasuryPart', + type: 'integer', + value: businessTreasuryPartValue + } + ], + chainId + }, + accounts.factory.seed + ) + ) + }) + + it('user should receive lp tokens, treasury should receive waves', async () => { + const priceScale = 1e8 + const paymentAmount = 1e8 + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'invest', args: [] }, + payment: [{ assetId: null, amount: paymentAmount }], + chainId + }, accounts.user1.seed)) + + const { balance: userBalance } = await api.assets.fetchBalanceAddressAssetId(accounts.user1.address, lpAssetId) + + const businessTreasuryPart = businessTreasuryPartValue / 1e8 + const featureTreasuryPart = 1 - businessTreasuryPart + const expectedUserBalance = Math.floor(paymentAmount * featureTreasuryPart * priceScale / price) + expect(userBalance, 'invalid user balance').to.equal(expectedUserBalance) + }) +}) diff --git a/contracts/calculator/test/process_blocks_with_business_treasury.spec.js b/contracts/calculator/test/process_blocks_with_business_treasury.spec.js new file mode 100644 index 0000000..4550564 --- /dev/null +++ b/contracts/calculator/test/process_blocks_with_business_treasury.spec.js @@ -0,0 +1,96 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { + api, + chainId, + broadcastAndWait, + baseSeed, + daoAddress +} from '../../../utils/api.js' +import { setup } from './_setup.js' +import { invokeScript, data } from '@waves/waves-transactions' +import wc from '@waves/ts-lib-crypto' + +chai.use(chaiAsPromised) +const { expect } = chai + +describe(`[${process.pid}] calculator: process blocks2`, () => { + let accounts, lpAssetId, periodLength, blockProcessingReward + const businessTreasuryPartValue = 1e8 / 20 + + before(async () => { + ({ accounts, lpAssetId, periodLength, blockProcessingReward } = + await setup()) + + await broadcastAndWait( + data( + { + additionalFee: 4e5, + data: [ + { + key: '%s__businessTreasuryPart', + type: 'integer', + value: businessTreasuryPartValue + } + ], + chainId + }, + accounts.factory.seed + ) + ) + }) + + it('rewardForOption function should parse dao reward', async () => { + const targetHeight = 2 + const response = await api.utils.fetchEvaluate( + accounts.calculator.address, + `rewardForOption(blockInfoByHeight(${targetHeight}).value().rewards, Address(base58'${daoAddress()}'))` + ) + const expectedReward = 200000000 + expect(response).to.not.have.property('error') + expect(response.result.value).to.equal(expectedReward) + }) + + it('generator should be able to claim lp tokens', async () => { + await broadcastAndWait( + invokeScript( + { + dApp: accounts.factory.address, + call: { function: 'processBlocks', args: [] }, + chainId + }, + accounts.user1.seed + ) + ) + await broadcastAndWait( + invokeScript( + { + dApp: accounts.factory.address, + call: { function: 'claimLP', args: [] }, + chainId + }, + baseSeed + ) + ) + const { balance } = await api.assets.fetchBalanceAddressAssetId( + wc.address(baseSeed, chainId), + lpAssetId + ) + const daoBlockReward = 2e8 + const expectedBalance = + daoBlockReward * periodLength - blockProcessingReward + expect(balance).to.equal(expectedBalance) + + const { balance: featureTreasuryBalance } = + await api.addresses.fetchBalance(accounts.mainTreasury.address) + const blockReward = 2e8 + const setupBalance = 100e8 // Waves amount from setup + const businessTreasuryPart = businessTreasuryPartValue / 1e8 + const featureTreasuryPart = 1 - businessTreasuryPart + const expectedFeatureTreasuryBalance = + blockReward * periodLength * featureTreasuryPart - + blockProcessingReward + + setupBalance + expect(featureTreasuryBalance).to.be.eql(expectedFeatureTreasuryBalance) + }) +}) From 3e89b679eb844d5bed29c61993b8aaf3be98f73d Mon Sep 17 00:00:00 2001 From: Epic waves rider <108883923+epicwavesrider@users.noreply.github.com> Date: Thu, 3 Aug 2023 18:55:40 +0800 Subject: [PATCH 122/143] feat: claimCollateral --- contracts/calculator/calculator.ride | 154 +++++++++++--- .../calculator/test/claim_collateral.spec.js | 2 +- .../test/claim_collateral_readonly.spec.js | 190 ++++++++++++++++++ contracts/calculator/test/claim_waves.spec.js | 2 +- contracts/factory/factory.ride | 8 + 5 files changed, 326 insertions(+), 30 deletions(-) create mode 100644 contracts/calculator/test/claim_collateral_readonly.spec.js diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index abe2eb3..ad3fd6d 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -6,7 +6,6 @@ let SEP = "__" let CONTRACT_NAME = "calculator.ride" let SCALE8 = 100_000_000 let PENDING = "PENDING" -let FINISHED = "FINISHED" let WAVES = "WAVES" func wrapErr(s: String) = { @@ -61,6 +60,9 @@ func valueWithdrawalRequest(status: String, lpAssetAmount: Int, targetPeriod: In } ["%s%d%d%s", status, lpAssetAmount.toString(), targetPeriod.toString(), claimTxIdStr].makeString(SEP) } +func keyWithdrawalHistory(userAddress: Address, txId: ByteVector) = { + ["%s%s%s", "withdrawalHistory", userAddress.toString(), txId.toBase58String()].makeString(SEP) +} func keyPeriodWithdrawalAssetIds(period: Int) = ["%s%d", "periodReward", period.toString()].makeString(SEP) func keyPeriodWithdrawalAmounts(period: Int) = ["%s%d", "periodRewardAmount", period.toString()].makeString(SEP) @@ -224,6 +226,53 @@ func finalizeINTERNAL( ) } +func claimCollateralINTERNAL(userAddressBytes: ByteVector, txId: ByteVector, transactionId: ByteVector) = { + let userAddress = Address(userAddressBytes) + let currentPeriodOrFail = + factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage(wrapErr("invalid period")) + let withdrawalRequestOption = factoryAddressOrFail + .getString(keyWithdrawalRequest(userAddress, txId)) + .valueOrErrorMessage(wrapErr("invalid withdrawal request")) + let (status, lpAssetAmount, targetPeriod, claimTxId) = parseWithdrawalRequestValueOrFail(withdrawalRequestOption) + if (currentPeriodOrFail < targetPeriod) then { + throwErr("invalid withdrawal request period") + } else { + let priceOrFail = + factoryAddressOrFail.getInteger(keyPriceForPeriod(targetPeriod)).valueOrErrorMessage(wrapErr("invalid price")) + let wavesAmount = if (priceOrFail > 0) then fraction(lpAssetAmount, priceOrFail, SCALE8) else 0 + + let assetsString = factoryAddressOrFail.getStringValue( + keyPeriodWithdrawalAssetIds(currentPeriodOrFail) + ) + let amountsString = factoryAddressOrFail.getStringValue( + keyPeriodWithdrawalAmounts(currentPeriodOrFail) + ) + + (userAddress, lpAssetAmount, targetPeriod, wavesAmount, assetsString, amountsString) + } +} + +func claimCollateralREADONLYStringResponse(userAddressBytes: ByteVector, txId: ByteVector, transactionId: ByteVector) = { + let ( + userAddress, + lpAssetAmount, + targetPeriod, + wavesAmount, + assetsString, + amountsString + ) = claimCollateralINTERNAL(userAddressBytes, txId, transactionId) + + let assets = assetsString.split_51C(SEP).removeByIndex(0).makeString(":") + let amounts = amountsString.split_51C(SEP).removeByIndex(0).makeString(":") + + [ + "%d%s%s", + wavesAmount.toString(), + assets, + amounts + ].makeString(SEP) +} + @Callable(i) func claimLP(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() @@ -499,38 +548,87 @@ func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { @Callable(i) func claimCollateral(userAddressBytes: ByteVector, txId: ByteVector) = { strict checkCaller = i.onlyFactory() - let userAddress = Address(userAddressBytes) - let currentPeriodOrFail = - factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage(wrapErr("invalid period")) - let withdrawalRequestOption = factoryAddressOrFail - .getString(keyWithdrawalRequest(userAddress, txId)) - .valueOrErrorMessage(wrapErr("invalid withdrawal request")) - let (status, lpAssetAmount, targetPeriod, claimTxId) = parseWithdrawalRequestValueOrFail(withdrawalRequestOption) - if (status == FINISHED) then { - throwErr("invalid withdrawal request status") - } else if (currentPeriodOrFail < targetPeriod) then { - throwErr("invalid withdrawal request period") - } else { - let priceOrFail = - factoryAddressOrFail.getInteger(keyPriceForPeriod(targetPeriod)).valueOrErrorMessage(wrapErr("invalid price")) - let amount = if (priceOrFail > 0) then fraction(lpAssetAmount, priceOrFail, SCALE8) else 0 - let factoryActions = [ - factoryAddressOrFail.invoke("stringEntry", [ - keyWithdrawalRequest(userAddress, txId), - valueWithdrawalRequest(FINISHED, lpAssetAmount, targetPeriod, i.transactionId) - ], []), + + let ( + userAddress, + lpAssetAmount, + targetPeriod, + wavesAmount, + assetsString, + amountsString + ) = claimCollateralINTERNAL(userAddressBytes, txId, i.transactionId) + + let assetsList = assetsString.split_51C(SEP).removeByIndex(0) + let amountsList = amountsString.split_51C(SEP).removeByIndex(0) + + let factoryActions = [ + factoryAddressOrFail.invoke("deleteEntry", [ + keyWithdrawalRequest(userAddress, txId) + ], []), + factoryAddressOrFail.invoke("integerEntry", [ + keyWithdrawalHistory(userAddress, txId), + lpAssetAmount + ], []), + factoryAddressOrFail.invoke("transferAssets", [userAddressBytes, assetsList, amountsList], []) + ] + + (nil, factoryActions) +} - let assetsList = factoryAddressOrFail.getStringValue( - keyPeriodWithdrawalAssetIds(currentPeriodOrFail) - ).split_51C(SEP).removeByIndex(0) - let amountsList = factoryAddressOrFail.getStringValue( - keyPeriodWithdrawalAmounts(currentPeriodOrFail) - ).split_51C(SEP).removeByIndex(0) +@Callable(i) +func claimCollateralBulk(userAddressBytes: ByteVector, txIds: List[ByteVector]) = { + strict checkCaller = i.onlyFactory() + func addNewAction(state: List[Any], txId: ByteVector) = { + let ( + userAddress, + lpAssetAmount, + targetPeriod, + wavesAmount, + assetsString, + amountsString + ) = claimCollateralINTERNAL(userAddressBytes, txId, i.transactionId) + + let assetsList = assetsString.split_51C(SEP).removeByIndex(0) + let amountsList = amountsString.split_51C(SEP).removeByIndex(0) + + let newActions = [ + factoryAddressOrFail.invoke("deleteEntry", [ + keyWithdrawalRequest(userAddress, txId) + ], []), + factoryAddressOrFail.invoke("integerEntry", [ + keyWithdrawalHistory(userAddress, txId), + lpAssetAmount + ], []), factoryAddressOrFail.invoke("transferAssets", [userAddressBytes, assetsList, amountsList], []) ] - (nil, factoryActions) + + state ++ newActions + } + + let allFactoryActions = FOLD<10>(txIds, [], addNewAction) + + (nil, allFactoryActions) +} + +@Callable(i) +func claimCollateralREADONLY(userAddressBytes: ByteVector, txId: ByteVector) = { + let response = claimCollateralREADONLYStringResponse(userAddressBytes, txId, i.transactionId) + + (nil, response) +} + +@Callable(i) +func claimCollateralBulkREADONLY(userAddressBytes: ByteVector, txIds: List[ByteVector]) = { + func processTxId(state: List[String], txId: ByteVector) = { + let response = claimCollateralREADONLYStringResponse(userAddressBytes, txId, i.transactionId) + + state :+ response } + + let allResponses = FOLD<10>(txIds, [], processTxId) + + (nil, allResponses) } @Callable(i) diff --git a/contracts/calculator/test/claim_collateral.spec.js b/contracts/calculator/test/claim_collateral.spec.js index dd726a1..4dd604f 100644 --- a/contracts/calculator/test/claim_collateral.spec.js +++ b/contracts/calculator/test/claim_collateral.spec.js @@ -144,7 +144,7 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { chainId }, accounts.user1.seed)) - const stateChangesTransfers = stateChanges.invokes[0].stateChanges.invokes[1].stateChanges.transfers + const stateChangesTransfers = stateChanges.invokes[0].stateChanges.invokes[2].stateChanges.transfers const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') const profitRaw = newTreasuryVolumeInWaves - investedWavesAmount diff --git a/contracts/calculator/test/claim_collateral_readonly.spec.js b/contracts/calculator/test/claim_collateral_readonly.spec.js new file mode 100644 index 0000000..a8e6c52 --- /dev/null +++ b/contracts/calculator/test/claim_collateral_readonly.spec.js @@ -0,0 +1,190 @@ +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; +import { + api, + chainId, + broadcastAndWait, + baseSeed, +} from "../../../utils/api.js"; +import { setup } from "./_setup.js"; +import { invokeScript, transfer, issue } from "@waves/waves-transactions"; + +chai.use(chaiAsPromised); +const { expect } = chai; + +const scale8 = 1e8; + +describe(`[${process.pid}] calculator: claim collateral readonly`, () => { + let accounts, lpAssetId, investedWavesAmount; + + before(async () => { + const { height } = await api.blocks.fetchHeight(); + investedWavesAmount = 500 * 1e8; + ({ accounts, lpAssetId } = await setup({ + investedWavesAmount, + nextBlockToProcess: height, + periodLength: 1, + })); + + await broadcastAndWait( + invokeScript( + { + dApp: accounts.factory.address, + call: { function: "processBlocks", args: [] }, + chainId, + }, + accounts.user1.seed + ) + ); + + const paymentAmount = 1e8; + investedWavesAmount += paymentAmount; + await broadcastAndWait( + invokeScript( + { + dApp: accounts.factory.address, + call: { function: "invest", args: [] }, + payment: [{ assetId: null, amount: paymentAmount }], + chainId, + }, + accounts.user1.seed + ) + ); + }); + + it("user should successfully claim assets after finalization", async () => { + const paymentAmount = 1e8; + + const { id: firstAssetId } = await broadcastAndWait( + issue( + { + name: "FirstAsset", + description: "", + quantity: 10e8, + decimals: 8, + reissuable: true, + chainId, + }, + baseSeed + ) + ); + + await broadcastAndWait( + transfer( + { + recipient: accounts.mainTreasury.address, + amount: 10e8, + assetId: firstAssetId, + additionalFee: 4e5, + }, + baseSeed + ) + ); + + const { id: secondAssetId } = await broadcastAndWait( + issue( + { + name: "SecondAsset", + description: "", + quantity: 10e8, + decimals: 8, + reissuable: true, + chainId, + }, + baseSeed + ) + ); + + await broadcastAndWait( + transfer( + { + recipient: accounts.mainTreasury.address, + amount: 10e8, + assetId: secondAssetId, + additionalFee: 4e5, + }, + baseSeed + ) + ); + + const { id: thirdAssetId } = await broadcastAndWait( + issue( + { + name: "ThirdAsset", + description: "", + quantity: 10e8, + decimals: 8, + reissuable: true, + chainId, + }, + baseSeed + ) + ); + + await broadcastAndWait( + transfer( + { + recipient: accounts.mainTreasury.address, + amount: 10e8, + assetId: thirdAssetId, + additionalFee: 4e5, + }, + baseSeed + ) + ); + + const { id: withdrawTxId } = await broadcastAndWait( + invokeScript( + { + dApp: accounts.factory.address, + call: { function: "withdraw", args: [] }, + payment: [{ assetId: lpAssetId, amount: paymentAmount }], + chainId, + }, + accounts.user1.seed + ) + ); + + const newTreasuryVolumeInWaves = 1100 * 1e8; + const pwrManagersBonusInWaves = 100 * 1e8; + const treasuryVolumeDiffAllocationCoef = 0; + const [{ quantity }] = await api.assets.fetchDetails([lpAssetId]); + await broadcastAndWait( + invokeScript( + { + dApp: accounts.factory.address, + call: { + function: "finalize", + args: [ + { type: "integer", value: newTreasuryVolumeInWaves }, + { type: "integer", value: pwrManagersBonusInWaves }, + { type: "integer", value: treasuryVolumeDiffAllocationCoef }, + ], + }, + payment: [ + { assetId: firstAssetId, amount: paymentAmount }, + { assetId: secondAssetId, amount: paymentAmount }, + { assetId: thirdAssetId, amount: paymentAmount }, + ], + chainId, + additionalFee: 4e5, + }, + accounts.mainTreasury.seed + ) + ); + + const expr = `claimCollateralREADONLY(\"${accounts.user1.address}\", \"${withdrawTxId}\")`; + const response = await api.utils.fetchEvaluate( + accounts.factory.address, + expr + ); + + const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') + const wavesAmount = Math.floor(paymentAmount * price / scale8) + + const responseString = response.result.value._2.value; + const expectedString = `%d%s%s__${wavesAmount}__${firstAssetId}:${secondAssetId}:${thirdAssetId}__${paymentAmount}:${paymentAmount}:${paymentAmount}` + + expect(responseString).to.eql(expectedString); + }); +}); diff --git a/contracts/calculator/test/claim_waves.spec.js b/contracts/calculator/test/claim_waves.spec.js index 9fd5596..17c3c79 100644 --- a/contracts/calculator/test/claim_waves.spec.js +++ b/contracts/calculator/test/claim_waves.spec.js @@ -77,7 +77,7 @@ describe(`[${process.pid}] calculator: claim waves`, () => { chainId }, accounts.user1.seed)) - const transfer = stateChanges.invokes[0].stateChanges.invokes[1].stateChanges.transfers[0] + const transfer = stateChanges.invokes[0].stateChanges.invokes[2].stateChanges.transfers[0] const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') const profitRaw = newTreasuryVolumeInWaves - investedWavesAmount diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 5eebbc7..da85928 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -328,6 +328,14 @@ func cancelWithdraw(txIdStr: String) = @Callable(i) func processBlocks() = (nil, calculatorAddressOrFail.reentrantInvoke("processBlocks", [i.caller.bytes], i.payments)) +@Callable(i) +func claimCollateralREADONLY(userAddress: String, txIdStr: String) = { + (nil, calculatorAddressOrFail.reentrantInvoke( + "claimCollateralREADONLY", + [userAddress.fromBase58String(), txIdStr.fromBase58String()], [] + )) +} + ##################### # MUTISIG FUNCTIONS # ##################### From 04d6e45cc8c072d48957f2af40635ed1b5a78532 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Mon, 7 Aug 2023 11:34:35 +0300 Subject: [PATCH 123/143] Power Share Some of the processed reward is send to Power Treasury --- contracts/calculator/calculator.ride | 44 +++++++++++++++---- contracts/calculator/test/_setup.js | 6 ++- contracts/calculator/test/power_share.spec.js | 43 ++++++++++++++++++ contracts/factory/factory.md | 3 ++ 4 files changed, 86 insertions(+), 10 deletions(-) create mode 100644 contracts/calculator/test/power_share.spec.js diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index b572d43..a5f2ebc 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -33,10 +33,13 @@ func keyManagerPublicKey() = ["%s", "managerPublicKey"].makeString(SEP) func keyLpAssetId() = ["%s", "lpAssetId"].makeString(SEP) func keyProxyTreasuryAddress() = ["%s", "proxyTreasury"].makeString(SEP) func keyMainTreasuryAddress() = ["%s", "mainTreasury"].makeString(SEP) +func keyPowerTreasuryAddress() = ["%s", "powerTreasury"].makeString(SEP) +func keyPowerShareRatio() = ["%s", "powerShareRatio"].makeString(SEP) # Scale 10^8, For example 0.2 = 2000_0000 func keyInvested(assetId: ByteVector|Unit) = ["%s%s", "invested", assetIdToString(assetId)].makeString(SEP) func keyDonated(assetId: ByteVector|Unit) = ["%s%s", "donated", assetIdToString(assetId)].makeString(SEP) func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toString()].makeString(SEP) func keyClaimed(userAddress: Address) = ["%s%s", "claimed", userAddress.toString()].makeString(SEP) +func keySwappedToPower(userAddress: Address) = ["%s%s", "swappedToPower", userAddress.toString()].makeString(SEP) func keyCurrentPeriod() = ["%s", "currentPeriod"].makeString(SEP) func keyPriceForPeriod(period: Int) = ["%s%d", "price", period.toString()].makeString(SEP) func keyStartHeight(period: Int) = ["%s%d", "startHeight", period.toString()].makeString(SEP) @@ -101,6 +104,15 @@ let mainTreasuryAddressOption = match factoryAddressOption { } let mainTreasuryAddressOrFail = mainTreasuryAddressOption.valueOrErrorMessage(wrapErr("invalid main treasury address")) +let powerTreasuryAddressOption = match factoryAddressOption { + case a: Address => match a.getString(keyPowerTreasuryAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit + } + case _: Unit => unit +} +let powerTreasuryAddressOrFail = powerTreasuryAddressOption.valueOrErrorMessage(wrapErr("invalid power treasury address")) + func getManagerPublicKeyOrUnit() = { match (factoryAddressOption) { case fa:Address => { @@ -257,7 +269,7 @@ func finalize( || throwErr("invalid treasury volume diff allocation coefficient") ] - # Finalize calcualtions + # Finalize calculations let ( paymentAmountMin, finalInvestedWavesAmount, @@ -345,7 +357,7 @@ func finalizeREADONLY( || throwErr("invalid treasury volume diff allocation coefficient") ] - # Finalize calcualtions + # Finalize calculations ([], finalizeINTERNAL(newTreasuryVolumeInWaves, pwrManagersBonusInWaves, treasuryVolumeDiffAllocationCoef)) } @@ -522,7 +534,7 @@ func processBlocks(userAddressBytes: ByteVector) = { let blockProcessingRewardByGenerator = blockProcessingReward / blocksProcessingBatchSize let blockProcessingRewardByGeneratorRemainder = blockProcessingReward - blockProcessingRewardByGenerator * blocksProcessingBatchSize - func map(acc: (Int, Int), inc: Int) = { + func map(acc: (Int, Int, Int), inc: Int) = { if (inc >= blocksProcessingBatchSize) then { acc } else { @@ -532,6 +544,7 @@ func processBlocks(userAddressBytes: ByteVector) = { .valueOrErrorMessage(wrapErr("invalid treasury reward for height " + targetBlockHeight.toString())) let generator = targetBlockInfo.generator let available = factoryAddressOrFail.getInteger(keyAvailable(generator)).valueOrElse(0) + let swappedToPower = factoryAddressOrFail.getInteger(keySwappedToPower(generator)).valueOrElse(0) let callerReward = if (inc == blocksProcessingBatchSize - 1) then { blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder @@ -539,8 +552,12 @@ func processBlocks(userAddressBytes: ByteVector) = { blockProcessingRewardByGenerator } + # Power Share Ratio cannot be more that 1.0 or less than 0.0 + let powerShareRatio = max([0, min([factoryAddressOrFail.getInteger(keyPowerShareRatio()).valueOrElse(0), SCALE8])]) + let powerShareAmount = fraction((treasuryRewardOrFail - callerReward), powerShareRatio, SCALE8) + let lpAssetAmount = if (currentPriceOrFail > 0) - then fraction(treasuryRewardOrFail - callerReward, SCALE8, currentPriceOrFail) + then fraction(treasuryRewardOrFail - callerReward - powerShareAmount, SCALE8, currentPriceOrFail) else 0 strict factoryActionsSingle = [ @@ -553,16 +570,21 @@ func processBlocks(userAddressBytes: ByteVector) = { userAddressBytes.toBase58String(), treasuryRewardOrFail.toString(), callerReward.toString(), - lpAssetAmount.toString() + lpAssetAmount.toString(), + powerShareAmount.toString() ], SEP) ], []), factoryAddressOrFail.invoke("integerEntry", [ keyAvailable(generator), available + lpAssetAmount + ], []), + factoryAddressOrFail.invoke("integerEntry", [ + keySwappedToPower(generator), + swappedToPower + powerShareAmount ], []) ] - let (lpAssetAcc, rewardAcc) = acc - (lpAssetAcc + lpAssetAmount, rewardAcc + treasuryRewardOrFail) + let (lpAssetAcc, rewardAcc, powerShareAcc) = acc + (lpAssetAcc + lpAssetAmount, rewardAcc + treasuryRewardOrFail, powerShareAcc + powerShareAmount) } } @@ -572,9 +594,9 @@ func processBlocks(userAddressBytes: ByteVector) = { 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 ] - strict (lpAssetAmountTotal, rewardAmountTotal) = FOLD<40>(list, (0, 0), map) + strict (lpAssetAmountTotal, rewardAmountTotal, powerShareAmountTotal) = FOLD<40>(list, (0, 0, 0), map) - let rewardToMainTreasuryAmount = rewardAmountTotal - blockProcessingReward + let rewardToMainTreasuryAmount = rewardAmountTotal - blockProcessingReward - powerShareAmountTotal let invested = factoryAddressOrFail.getInteger(keyInvested(unit)).valueOrElse(0) strict actions = [ @@ -593,6 +615,10 @@ func processBlocks(userAddressBytes: ByteVector) = { userAddressBytes, blockProcessingReward ], []), + factoryAddressOrFail.invoke("transferFromProxyTreasury", [ + powerTreasuryAddressOrFail.bytes, + powerShareAmountTotal + ], []), # increase invested amount factoryAddressOrFail.invoke("integerEntry", [ keyInvested(unit), invested + rewardToMainTreasuryAmount diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index 7ce4605..36c76f9 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -26,7 +26,8 @@ export const setup = async ({ price = 100000000, period = 0, donatedWavesAmount = 0, - investedWavesAmount = 0 + investedWavesAmount = 0, + powerShareRatio = 0 } = {}) => { const nonce = wc.random(nonceLength, 'Buffer').toString('hex') const names = [ @@ -34,6 +35,7 @@ export const setup = async ({ 'calculator', 'treasury', 'mainTreasury', + 'powerTreasury', 'user1' ] const accounts = Object.fromEntries(names.map((item) => { @@ -96,6 +98,8 @@ export const setup = async ({ { key: '%s__calculator', type: 'string', value: accounts.calculator.address }, { key: '%s__proxyTreasury', type: 'string', value: daoAddress() }, { key: '%s__mainTreasury', type: 'string', value: accounts.mainTreasury.address }, + { key: '%s__powerTreasury', type: 'string', value: accounts.powerTreasury.address }, + { key: '%s__powerShareRatio', type: 'integer', value: powerShareRatio }, { key: '%s__lpAssetId', type: 'string', value: lpAssetId }, { key: '%s__nextBlockToProcess', type: 'integer', value: nextBlockToProcess }, { key: '%s__currentPeriod', type: 'integer', value: currentPeriod }, diff --git a/contracts/calculator/test/power_share.spec.js b/contracts/calculator/test/power_share.spec.js new file mode 100644 index 0000000..025cc6a --- /dev/null +++ b/contracts/calculator/test/power_share.spec.js @@ -0,0 +1,43 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { api, chainId, broadcastAndWait } from '../../../utils/api.js' +import { setup } from './_setup.js' +import { invokeScript, data } from '@waves/waves-transactions' + +chai.use(chaiAsPromised) +const { expect } = chai + +describe(`[${process.pid}] calculator: process blocks`, () => { + let accounts, periodLength, blockProcessingReward + + before(async () => { + ({ accounts, periodLength, blockProcessingReward } = await setup()) + + await broadcastAndWait(data({ + additionalFee: 4e5, + data: [ + { key: '%s__powerShareRatio', type: 'integer', value: 13000000 } // 13% = 0.13 * 10^8 + ], + chainId + }, accounts.factory.seed)) + }) + + it('power share should be transferred to power treasury', async () => { + const blockReward = 2e8 + const powerShareAmount = 51935000 // ((blockReward * periodLength) - blockProcessingReward) * powerShareRatio + const setupBalance = 100e8 // Waves amount from setup + + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'processBlocks', args: [] }, + chainId + }, accounts.user1.seed)) + const { balance: powerTreasuryBalance } = await api.addresses.fetchBalance(accounts.powerTreasury.address) + const expectedPowerTreasuryBalance = powerShareAmount + setupBalance + expect(powerTreasuryBalance).to.equal(expectedPowerTreasuryBalance) + + const { balance: featureTreasuryBalance } = await api.addresses.fetchBalance(accounts.mainTreasury.address) + const expectedFeatureTreasuryBalance = blockReward * periodLength - blockProcessingReward - powerShareAmount + setupBalance + expect(featureTreasuryBalance).to.be.eql(expectedFeatureTreasuryBalance) + }) +}) diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index 33ecf9e..3c3f47d 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -5,6 +5,7 @@ | `%s__calculator` | `String` | Calculator Address | | `%s__proxyTreasury` | `String` | Proxy Treasury Address | | `%s__mainTreasury` | `String` | Main Treasury Address | +| `%s__powerTreasury` | `String` | Power Treasury Address | | `%s__config` | `String` | DAO Config address | | `%s__lpAssetId` | `String` | LP Asset ID | | `%s__currentPeriod` | `Int` | Current period num | @@ -14,6 +15,7 @@ | `%s%d__startHeight__` | `Int` | Starting Height of `` | | `%s%d__price__` | `Int` | LP Asset Price for `` | | `%s__nextBlockToProcess` | `Int` | Next block height to process | +| `%s__powerShareRatio` | `Int` | Power share ratio | ### User state @@ -21,6 +23,7 @@ | :------------------------------------------ | :------- | :--------------------------------- | | `%s%s__available__` | `Int` | Available LP Asset amount to Claim | | `%s%s__claimed__` | `Int` | LP Asset amount already claimed | +| `%s%s__swappedToPower__` | `Int` | Waves amount swapped to Power | | `%s%s%s__withdrawal____` | `String` | Withdrawal request parameters | ``` From fe129958100b099963a73dea6de4d8d1b09ca930 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 15 Aug 2023 10:08:59 +0300 Subject: [PATCH 124/143] Power Share and staking --- contracts/calculator/calculator.ride | 85 +++++++++++++------ contracts/calculator/mock/power.mock.ride | 13 +++ contracts/calculator/mock/swap.mock.ride | 15 ++++ contracts/calculator/test/_setup.js | 29 ++++++- contracts/calculator/test/finalize.spec.js | 1 - contracts/calculator/test/power_share.spec.js | 25 ++++-- contracts/factory/factory.md | 7 +- contracts/factory/factory.ride | 57 ++++++++++--- 8 files changed, 185 insertions(+), 47 deletions(-) create mode 100644 contracts/calculator/mock/power.mock.ride create mode 100644 contracts/calculator/mock/swap.mock.ride diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index a5f2ebc..f2290d6 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -33,8 +33,9 @@ func keyManagerPublicKey() = ["%s", "managerPublicKey"].makeString(SEP) func keyLpAssetId() = ["%s", "lpAssetId"].makeString(SEP) func keyProxyTreasuryAddress() = ["%s", "proxyTreasury"].makeString(SEP) func keyMainTreasuryAddress() = ["%s", "mainTreasury"].makeString(SEP) -func keyPowerTreasuryAddress() = ["%s", "powerTreasury"].makeString(SEP) +func keyPowerContractAddress() = ["%s", "powerContract"].makeString(SEP) func keyPowerShareRatio() = ["%s", "powerShareRatio"].makeString(SEP) # Scale 10^8, For example 0.2 = 2000_0000 +func keyPowerAssetId() = ["%s", "powerAssetId"].makeString(SEP) func keyInvested(assetId: ByteVector|Unit) = ["%s%s", "invested", assetIdToString(assetId)].makeString(SEP) func keyDonated(assetId: ByteVector|Unit) = ["%s%s", "donated", assetIdToString(assetId)].makeString(SEP) func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toString()].makeString(SEP) @@ -104,14 +105,15 @@ let mainTreasuryAddressOption = match factoryAddressOption { } let mainTreasuryAddressOrFail = mainTreasuryAddressOption.valueOrErrorMessage(wrapErr("invalid main treasury address")) -let powerTreasuryAddressOption = match factoryAddressOption { - case a: Address => match a.getString(keyPowerTreasuryAddress()) { +let powerContractAddressOption = match factoryAddressOption { + case a: Address => match a.getString(keyPowerContractAddress()) { case s: String => s.addressFromString() case _: Unit => unit } case _: Unit => unit } -let powerTreasuryAddressOrFail = powerTreasuryAddressOption.valueOrErrorMessage(wrapErr("invalid power treasury address")) +let powerContractAddressOrFail = powerContractAddressOption.valueOrErrorMessage(wrapErr("invalid power contract address")) +let powerAssetIdStringOrFail = factoryAddressOrFail.getString(keyPowerAssetId()).valueOrErrorMessage(wrapErr("power asset id not found")) func getManagerPublicKeyOrUnit() = { match (factoryAddressOption) { @@ -515,7 +517,7 @@ func processBlocks(userAddressBytes: ByteVector) = { .valueOrErrorMessage(wrapErr("invalid next block to process")) let periodEndHeight = currentStartHeight + periodLength - 1 - let blocksProcessingBatchSizeMax = 40 + let blocksProcessingBatchSizeMax = 20 # do not process blocks not in current period let blocksProcessingBatchSize = if ( @@ -534,7 +536,7 @@ func processBlocks(userAddressBytes: ByteVector) = { let blockProcessingRewardByGenerator = blockProcessingReward / blocksProcessingBatchSize let blockProcessingRewardByGeneratorRemainder = blockProcessingReward - blockProcessingRewardByGenerator * blocksProcessingBatchSize - func map(acc: (Int, Int, Int), inc: Int) = { + func map(acc: (Int, Int, (Int, List[(String, Int)])), inc: Int) = { if (inc >= blocksProcessingBatchSize) then { acc } else { @@ -554,10 +556,10 @@ func processBlocks(userAddressBytes: ByteVector) = { # Power Share Ratio cannot be more that 1.0 or less than 0.0 let powerShareRatio = max([0, min([factoryAddressOrFail.getInteger(keyPowerShareRatio()).valueOrElse(0), SCALE8])]) - let powerShareAmount = fraction((treasuryRewardOrFail - callerReward), powerShareRatio, SCALE8) + let shareAmountToPower = fraction((treasuryRewardOrFail - callerReward), powerShareRatio, SCALE8) let lpAssetAmount = if (currentPriceOrFail > 0) - then fraction(treasuryRewardOrFail - callerReward - powerShareAmount, SCALE8, currentPriceOrFail) + then fraction(treasuryRewardOrFail - callerReward - shareAmountToPower, SCALE8, currentPriceOrFail) else 0 strict factoryActionsSingle = [ @@ -571,32 +573,71 @@ func processBlocks(userAddressBytes: ByteVector) = { treasuryRewardOrFail.toString(), callerReward.toString(), lpAssetAmount.toString(), - powerShareAmount.toString() + shareAmountToPower.toString() ], SEP) ], []), factoryAddressOrFail.invoke("integerEntry", [ keyAvailable(generator), available + lpAssetAmount - ], []), - factoryAddressOrFail.invoke("integerEntry", [ - keySwappedToPower(generator), - swappedToPower + powerShareAmount ], []) ] - let (lpAssetAcc, rewardAcc, powerShareAcc) = acc - (lpAssetAcc + lpAssetAmount, rewardAcc + treasuryRewardOrFail, powerShareAcc + powerShareAmount) + + let (lpAssetAcc, rewardAcc, powerShareDataTuple) = acc + let (powerShareAcc, generatorPowerShareList) = powerShareDataTuple + let newGeneratorPowerShareList = generatorPowerShareList :+ (generator.toString(), shareAmountToPower) + + (lpAssetAcc + lpAssetAmount, rewardAcc + treasuryRewardOrFail, (powerShareAcc + shareAmountToPower, newGeneratorPowerShareList)) } } let list = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ] - strict (lpAssetAmountTotal, rewardAmountTotal, powerShareAmountTotal) = FOLD<40>(list, (0, 0, 0), map) + strict (lpAssetAmountTotal, rewardAmountTotal, powerShareDataTuple) = FOLD<20>(list, (0, 0, (0, [])), map) + + let (amountToPowerTotal, powerShareAmountsList) = powerShareDataTuple + let rewardToMainTreasuryAmount = rewardAmountTotal - blockProcessingReward - amountToPowerTotal + + strict powerShareActions = if (amountToPowerTotal > 0) then { + # Send swap amount to factory + strict transferAction = [ + factoryAddressOrFail.invoke("transferFromProxyTreasury", [ + factoryAddressOrFail.bytes, + amountToPowerTotal + ], []) + ] + # Swap share amount to power token + strict totalPowerAmount = + factoryAddressOrFail.invoke("swap", + [powerAssetIdStringOrFail], + [AttachedPayment(unit, amountToPowerTotal)]) + + let totalPowerAmountInt = match(totalPowerAmount) { + case pAmount:Int => pAmount + case _ => 0 + } + + func stakePowerInvoke(acc: Int, next: (String, Int)) = { + let (generator, shareAmount) = next + if (amountToPowerTotal > 0) then { + let powerAmount = fraction(shareAmount, totalPowerAmountInt, amountToPowerTotal) + strict inv = factoryAddressOrFail.invoke( + "powerStake", + [generator.fromBase58String()], + [AttachedPayment(powerAssetIdStringOrFail.fromBase58String(), powerAmount)]) + nil + } else { nil } + } + + # Stake power tokens + strict powerStakesActions = FOLD<20>(powerShareAmountsList, 0, stakePowerInvoke) + + nil + } else { + nil + } - let rewardToMainTreasuryAmount = rewardAmountTotal - blockProcessingReward - powerShareAmountTotal let invested = factoryAddressOrFail.getInteger(keyInvested(unit)).valueOrElse(0) strict actions = [ @@ -615,10 +656,6 @@ func processBlocks(userAddressBytes: ByteVector) = { userAddressBytes, blockProcessingReward ], []), - factoryAddressOrFail.invoke("transferFromProxyTreasury", [ - powerTreasuryAddressOrFail.bytes, - powerShareAmountTotal - ], []), # increase invested amount factoryAddressOrFail.invoke("integerEntry", [ keyInvested(unit), invested + rewardToMainTreasuryAmount diff --git a/contracts/calculator/mock/power.mock.ride b/contracts/calculator/mock/power.mock.ride new file mode 100644 index 0000000..6a76c73 --- /dev/null +++ b/contracts/calculator/mock/power.mock.ride @@ -0,0 +1,13 @@ +{-# STDLIB_VERSION 6 #-} +{-# CONTENT_TYPE DAPP #-} +{-# SCRIPT_TYPE ACCOUNT #-} + +@Callable(i) +func commitForMiner(addressString: String) = { + let key = addressString + "_staked" + let staked = this.getInteger(key).valueOrElse(0) + + [ + IntegerEntry(key, staked + i.payments[0].amount) + ] +} diff --git a/contracts/calculator/mock/swap.mock.ride b/contracts/calculator/mock/swap.mock.ride new file mode 100644 index 0000000..11b0b02 --- /dev/null +++ b/contracts/calculator/mock/swap.mock.ride @@ -0,0 +1,15 @@ +{-# STDLIB_VERSION 6 #-} +{-# CONTENT_TYPE DAPP #-} +{-# SCRIPT_TYPE ACCOUNT #-} + +let scale8 = 1_0000_0000 + +@Callable(i) +func swap(slippage: Int, assetIdString: String, addressString: String) = { + let price = 5_000_0000 + let sendAmount = fraction(i.payments[0].amount, price, scale8) + + [ + ScriptTransfer(Address(addressString.fromBase58String()), sendAmount, assetIdString.fromBase58String()) + ] +} diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index 36c76f9..39af0d7 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -16,6 +16,8 @@ const nonceLength = 3 const calculatorPath = format({ dir: 'contracts/calculator', base: 'calculator.ride' }) const factoryPath = format({ dir: 'contracts/factory', base: 'factory.ride' }) const proxyTreasuryPath = format({ dir: 'contracts/treasury', base: 'proxy_treasury.ride' }) +const powerContractPath = format({ dir: 'contracts/calculator/mock', base: 'power.mock.ride' }) +const swapContractPath = format({ dir: 'contracts/calculator/mock', base: 'swap.mock.ride' }) const scale8 = 1e8 export const setup = async ({ @@ -35,7 +37,8 @@ export const setup = async ({ 'calculator', 'treasury', 'mainTreasury', - 'powerTreasury', + 'powerContract', + 'swapContract', 'user1' ] const accounts = Object.fromEntries(names.map((item) => { @@ -58,6 +61,7 @@ export const setup = async ({ const lpAssetAmountToIssueRaw = Math.floor(investedWavesAmount * price / scale8) const lpAssetAmountToIssue = lpAssetAmountToIssueRaw === 0 ? 1 : lpAssetAmountToIssueRaw + const powerAmountToIssue = 1e14 const { id: lpAssetId } = await broadcastAndWait(issue({ name: 'WAVESDAOLP', @@ -76,6 +80,21 @@ export const setup = async ({ }, accounts.factory.seed)) } + const { id: powerAssetId } = await broadcastAndWait(issue({ + name: 'PWRTKN', + description: 'PWR', + quantity: powerAmountToIssue, + decimals: 8, + reissuable: true, + chainId + }, accounts.treasury.seed)) + + await broadcastAndWait(massTransfer({ + transfers: Object.values(accounts).map(({ address }) => ({ recipient: address, amount })), + assetId: powerAssetId, + chainId + }, accounts.treasury.seed)) + await broadcastAndWait(data({ additionalFee: 4e5, data: [ @@ -98,8 +117,10 @@ export const setup = async ({ { key: '%s__calculator', type: 'string', value: accounts.calculator.address }, { key: '%s__proxyTreasury', type: 'string', value: daoAddress() }, { key: '%s__mainTreasury', type: 'string', value: accounts.mainTreasury.address }, - { key: '%s__powerTreasury', type: 'string', value: accounts.powerTreasury.address }, + { key: '%s__powerContract', type: 'string', value: accounts.powerContract.address }, { key: '%s__powerShareRatio', type: 'integer', value: powerShareRatio }, + { key: '%s__powerAssetId', type: 'string', value: powerAssetId }, + { key: '%s__swapContract', type: 'string', value: accounts.swapContract.address }, { key: '%s__lpAssetId', type: 'string', value: lpAssetId }, { key: '%s__nextBlockToProcess', type: 'integer', value: nextBlockToProcess }, { key: '%s__currentPeriod', type: 'integer', value: currentPeriod }, @@ -116,6 +137,8 @@ export const setup = async ({ await setScriptFromFile(calculatorPath, accounts.calculator.seed) await setScriptFromFile(factoryPath, accounts.factory.seed) await setScriptFromFile(proxyTreasuryPath, daoSeed) + await setScriptFromFile(powerContractPath, accounts.powerContract.seed) + await setScriptFromFile(swapContractPath, accounts.swapContract.seed) - return { accounts, lpAssetId, periodLength, blockProcessingReward, price } + return { accounts, lpAssetId, powerAssetId, periodLength, blockProcessingReward, price } } diff --git a/contracts/calculator/test/finalize.spec.js b/contracts/calculator/test/finalize.spec.js index 0666afb..c3fab1f 100644 --- a/contracts/calculator/test/finalize.spec.js +++ b/contracts/calculator/test/finalize.spec.js @@ -113,7 +113,6 @@ describe(`[${process.pid}] calculator: finalize`, () => { } const expectedPrice = Math.floor((totalInvestAmount + investProfit) * scale8 / quantity) - console.log(price / scale8, expectedPrice / scale8) expect(price, 'invalid price').to.equal(expectedPrice) const expectedFactoryBalance = factoryBalanceBefore + paymentAmount expect(factoryBalanceAfter, 'invalid factory balance').to.equal(expectedFactoryBalance) diff --git a/contracts/calculator/test/power_share.spec.js b/contracts/calculator/test/power_share.spec.js index 025cc6a..a1e1493 100644 --- a/contracts/calculator/test/power_share.spec.js +++ b/contracts/calculator/test/power_share.spec.js @@ -8,15 +8,20 @@ chai.use(chaiAsPromised) const { expect } = chai describe(`[${process.pid}] calculator: process blocks`, () => { - let accounts, periodLength, blockProcessingReward + const powerShareRatio = 0.13 + const maxProcessBlocks = 20 // Set in calculator.ride + let accounts, periodLength, blockProcessingReward, powerAssetId before(async () => { - ({ accounts, periodLength, blockProcessingReward } = await setup()) + ({ accounts, periodLength, blockProcessingReward, powerAssetId } = await setup({ + periodLength: 1440, + blockProcessingReward: 500000 + })) await broadcastAndWait(data({ additionalFee: 4e5, data: [ - { key: '%s__powerShareRatio', type: 'integer', value: 13000000 } // 13% = 0.13 * 10^8 + { key: '%s__powerShareRatio', type: 'integer', value: powerShareRatio * 1e8 } ], chainId }, accounts.factory.seed)) @@ -24,7 +29,10 @@ describe(`[${process.pid}] calculator: process blocks`, () => { it('power share should be transferred to power treasury', async () => { const blockReward = 2e8 - const powerShareAmount = 51935000 // ((blockReward * periodLength) - blockProcessingReward) * powerShareRatio + const powerPrice = 0.5 // Set in mock contract + const blocksCount = Math.min(periodLength, maxProcessBlocks) + const sharedPartInWaves = Math.floor((blockReward * blocksCount - blockProcessingReward) * powerShareRatio) + const sharedPartInPower = Math.floor(sharedPartInWaves * powerPrice) const setupBalance = 100e8 // Waves amount from setup await broadcastAndWait(invokeScript({ @@ -32,12 +40,13 @@ describe(`[${process.pid}] calculator: process blocks`, () => { call: { function: 'processBlocks', args: [] }, chainId }, accounts.user1.seed)) - const { balance: powerTreasuryBalance } = await api.addresses.fetchBalance(accounts.powerTreasury.address) - const expectedPowerTreasuryBalance = powerShareAmount + setupBalance - expect(powerTreasuryBalance).to.equal(expectedPowerTreasuryBalance) + + const { balance: powerContractBalance } = await api.assets.fetchBalanceAddressAssetId(accounts.powerContract.address, powerAssetId) + const expectedPowerTreasuryBalance = sharedPartInPower + setupBalance + expect(powerContractBalance).to.equal(expectedPowerTreasuryBalance) const { balance: featureTreasuryBalance } = await api.addresses.fetchBalance(accounts.mainTreasury.address) - const expectedFeatureTreasuryBalance = blockReward * periodLength - blockProcessingReward - powerShareAmount + setupBalance + const expectedFeatureTreasuryBalance = blockReward * blocksCount - blockProcessingReward - sharedPartInWaves + setupBalance expect(featureTreasuryBalance).to.be.eql(expectedFeatureTreasuryBalance) }) }) diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index 3c3f47d..7c442a8 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -5,9 +5,11 @@ | `%s__calculator` | `String` | Calculator Address | | `%s__proxyTreasury` | `String` | Proxy Treasury Address | | `%s__mainTreasury` | `String` | Main Treasury Address | -| `%s__powerTreasury` | `String` | Power Treasury Address | +| `%s__powerContract` | `String` | Power dApp Address | +| `%s__swapContract` | `String` | WX Swap Contract Address | | `%s__config` | `String` | DAO Config address | | `%s__lpAssetId` | `String` | LP Asset ID | +| `%s__powerAssetId` | `String` | Power Asset ID | | `%s__currentPeriod` | `Int` | Current period num | | `%s__periodLength` | `Int` | Period length in blocks | | `%s%s__invested__WAVES` | `Int` | Invested Amount in Waves | @@ -86,6 +88,9 @@ func claimWaves(txIdStr: String) ### Block processing Process block miners rewards. +Block processing reward amount sent to caller. +Waves amount equals to Power Share Ratio is converted to Power Asset. +Power assets immediately staked in Power dApp Contract ``` @Callable(i) diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 5cc7948..161ac4e 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -102,6 +102,8 @@ func voteINTERNAL( func keyCalculatorAddress() = "%s__calculator" func keyProxyTreasuryAddress() = "%s__proxyTreasury" # 3PEgG7eZHLFhcfsTSaYxgRhZsh4AxMvA4Ms +func keyPowerContractAddress() = "%s__powerContract" # TODO: +func keySwapContractAddress() = "%s__swapContract" # TODO: func keyChildAddress() = "%s__child" # 3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h # 0.005 waves to compensate the cost of the transaction func keyBlockProcessingReward() = "%s__blockProcessingReward" @@ -122,6 +124,18 @@ let proxyTreasuryAddressOption = match this.getString(keyProxyTreasuryAddress()) } let proxyTreasuryAddressOrFail = proxyTreasuryAddressOption.valueOrErrorMessage(wrapErr("invalid proxy treasury address")) +let powerContractAddressOption = match this.getString(keyPowerContractAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit +} +let powerContractAddressOrFail = powerContractAddressOption.valueOrErrorMessage(wrapErr("invalid power contract address")) + +let swapContractAddressOption = match this.getString(keySwapContractAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit +} +let swapContractAddressOrFail = swapContractAddressOption.valueOrErrorMessage(wrapErr("invalid swap contract address")) + func keyConfigAddress() = "%s__config" # config keys @@ -216,12 +230,12 @@ func burn(amount: Int) = if (i.onlyCalculator()) then ([Burn(lpAssetIdOrFail, amount)], amount) else ([], unit) @Callable(i) -func transferAsset(recepientBytes: ByteVector, amount: Int, assetId: ByteVector) = - if (i.onlyCalculator()) then ([ScriptTransfer(Address(recepientBytes), amount, assetId)], amount) else ([], unit) +func transferAsset(recipientBytes: ByteVector, amount: Int, assetId: ByteVector) = + if (i.onlyCalculator()) then ([ScriptTransfer(Address(recipientBytes), amount, assetId)], amount) else ([], unit) @Callable(i) -func transferWaves(recepientBytes: ByteVector, amount: Int) = - if (i.onlyCalculator()) then ([ScriptTransfer(Address(recepientBytes), amount, unit)], amount) else ([], unit) +func transferWaves(recipientBytes: ByteVector, amount: Int) = + if (i.onlyCalculator()) then ([ScriptTransfer(Address(recipientBytes), amount, unit)], amount) else ([], unit) @Callable(i) func transferFromProxyTreasury(recipientBytes: ByteVector, rewardsAmount: Int) = @@ -301,9 +315,32 @@ func cancelWithdraw(txIdStr: String) = @Callable(i) func processBlocks() = (nil, calculatorAddressOrFail.reentrantInvoke("processBlocks", [i.caller.bytes], i.payments)) -##################### -# MUTISIG FUNCTIONS # -##################### +@Callable(i) +func swap(assetId: String) = { + strict check = [ i.onlyCalculator() ] + + strict initAssetBalance = if (assetId == "WAVES") + then this.wavesBalance().available + else this.assetBalance(assetId.fromBase58String()) + + strict swapInvoke = swapContractAddressOrFail.invoke("swap", [0, assetId, this.toString()], i.payments) + + strict newAssetBalance = if (assetId == "WAVES") + then this.wavesBalance().available + else this.assetBalance(assetId.fromBase58String()) + + (nil, newAssetBalance - initAssetBalance) +} + +@Callable(i) +func powerStake(recipientBytes: ByteVector) = + if (i.onlyCalculator()) + then (nil, powerContractAddressOrFail.invoke("commitForMiner", [Address(recipientBytes).toString()], i.payments)) + else ([], unit) + +###################### +# MULTISIG FUNCTIONS # +###################### # Vote for txId that is allowed in Verifier @Callable(i) func voteForTxId(txId: String) = { @@ -319,9 +356,9 @@ func voteForTxId(txId: String) = { voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result) } -######################### -# MUTISIG FUNCTIONS END # -######################### +########################## +# MULTISIG FUNCTIONS END # +########################## @Verifier(tx) func verify() = { From 2685b44a5e261139bff2aa5a63566d10a96486f1 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 15 Aug 2023 13:27:43 +0300 Subject: [PATCH 125/143] Removed unused key Updated power mock --- contracts/calculator/calculator.ride | 1 - contracts/calculator/mock/power.mock.ride | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 4e3beca..3633f4f 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -45,7 +45,6 @@ func keyInvested(assetId: ByteVector|Unit) = ["%s%s", "invested", assetIdToStrin func keyDonated(assetId: ByteVector|Unit) = ["%s%s", "donated", assetIdToString(assetId)].makeString(SEP) func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toString()].makeString(SEP) func keyClaimed(userAddress: Address) = ["%s%s", "claimed", userAddress.toString()].makeString(SEP) -func keySwappedToPower(userAddress: Address) = ["%s%s", "swappedToPower", userAddress.toString()].makeString(SEP) func keyCurrentPeriod() = ["%s", "currentPeriod"].makeString(SEP) func keyPriceForPeriod(period: Int) = ["%s%d", "price", period.toString()].makeString(SEP) func keyStartHeight(period: Int) = ["%s%d", "startHeight", period.toString()].makeString(SEP) diff --git a/contracts/calculator/mock/power.mock.ride b/contracts/calculator/mock/power.mock.ride index 6a76c73..7deae0c 100644 --- a/contracts/calculator/mock/power.mock.ride +++ b/contracts/calculator/mock/power.mock.ride @@ -4,10 +4,12 @@ @Callable(i) func commitForMiner(addressString: String) = { - let key = addressString + "_staked" + let index = this.getInteger("index").valueOrElse(0) + let key = addressString + "_staked_" + index.toString() let staked = this.getInteger(key).valueOrElse(0) [ - IntegerEntry(key, staked + i.payments[0].amount) + IntegerEntry(key, staked + i.payments[0].amount), + IntegerEntry("index", index + 1) ] } From 9fc9be5b2ddddd237b1b96cf814ee13035afa6cf Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 15 Aug 2023 13:29:11 +0300 Subject: [PATCH 126/143] Removed unused key Updated power mock --- contracts/calculator/calculator.ride | 2 -- contracts/calculator/mock/power.mock.ride | 6 ++++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 4e3beca..a2a6b3a 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -45,7 +45,6 @@ func keyInvested(assetId: ByteVector|Unit) = ["%s%s", "invested", assetIdToStrin func keyDonated(assetId: ByteVector|Unit) = ["%s%s", "donated", assetIdToString(assetId)].makeString(SEP) func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toString()].makeString(SEP) func keyClaimed(userAddress: Address) = ["%s%s", "claimed", userAddress.toString()].makeString(SEP) -func keySwappedToPower(userAddress: Address) = ["%s%s", "swappedToPower", userAddress.toString()].makeString(SEP) func keyCurrentPeriod() = ["%s", "currentPeriod"].makeString(SEP) func keyPriceForPeriod(period: Int) = ["%s%d", "price", period.toString()].makeString(SEP) func keyStartHeight(period: Int) = ["%s%d", "startHeight", period.toString()].makeString(SEP) @@ -695,7 +694,6 @@ func processBlocks(userAddressBytes: ByteVector) = { .valueOrErrorMessage(wrapErr("invalid treasury reward for height " + targetBlockHeight.toString())) let generator = targetBlockInfo.generator let available = factoryAddressOrFail.getInteger(keyAvailable(generator)).valueOrElse(0) - let swappedToPower = factoryAddressOrFail.getInteger(keySwappedToPower(generator)).valueOrElse(0) let callerReward = if (inc == blocksProcessingBatchSize - 1) then { blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder diff --git a/contracts/calculator/mock/power.mock.ride b/contracts/calculator/mock/power.mock.ride index 6a76c73..7deae0c 100644 --- a/contracts/calculator/mock/power.mock.ride +++ b/contracts/calculator/mock/power.mock.ride @@ -4,10 +4,12 @@ @Callable(i) func commitForMiner(addressString: String) = { - let key = addressString + "_staked" + let index = this.getInteger("index").valueOrElse(0) + let key = addressString + "_staked_" + index.toString() let staked = this.getInteger(key).valueOrElse(0) [ - IntegerEntry(key, staked + i.payments[0].amount) + IntegerEntry(key, staked + i.payments[0].amount), + IntegerEntry("index", index + 1) ] } From bc45891e67c969bbc49cce84951c2797adb38c8e Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 15 Aug 2023 13:31:47 +0300 Subject: [PATCH 127/143] Removed unused key Updated power mock --- contracts/calculator/calculator.ride | 2 -- contracts/calculator/mock/power.mock.ride | 6 ++++-- contracts/factory/factory.md | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 4e3beca..a2a6b3a 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -45,7 +45,6 @@ func keyInvested(assetId: ByteVector|Unit) = ["%s%s", "invested", assetIdToStrin func keyDonated(assetId: ByteVector|Unit) = ["%s%s", "donated", assetIdToString(assetId)].makeString(SEP) func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toString()].makeString(SEP) func keyClaimed(userAddress: Address) = ["%s%s", "claimed", userAddress.toString()].makeString(SEP) -func keySwappedToPower(userAddress: Address) = ["%s%s", "swappedToPower", userAddress.toString()].makeString(SEP) func keyCurrentPeriod() = ["%s", "currentPeriod"].makeString(SEP) func keyPriceForPeriod(period: Int) = ["%s%d", "price", period.toString()].makeString(SEP) func keyStartHeight(period: Int) = ["%s%d", "startHeight", period.toString()].makeString(SEP) @@ -695,7 +694,6 @@ func processBlocks(userAddressBytes: ByteVector) = { .valueOrErrorMessage(wrapErr("invalid treasury reward for height " + targetBlockHeight.toString())) let generator = targetBlockInfo.generator let available = factoryAddressOrFail.getInteger(keyAvailable(generator)).valueOrElse(0) - let swappedToPower = factoryAddressOrFail.getInteger(keySwappedToPower(generator)).valueOrElse(0) let callerReward = if (inc == blocksProcessingBatchSize - 1) then { blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder diff --git a/contracts/calculator/mock/power.mock.ride b/contracts/calculator/mock/power.mock.ride index 6a76c73..7deae0c 100644 --- a/contracts/calculator/mock/power.mock.ride +++ b/contracts/calculator/mock/power.mock.ride @@ -4,10 +4,12 @@ @Callable(i) func commitForMiner(addressString: String) = { - let key = addressString + "_staked" + let index = this.getInteger("index").valueOrElse(0) + let key = addressString + "_staked_" + index.toString() let staked = this.getInteger(key).valueOrElse(0) [ - IntegerEntry(key, staked + i.payments[0].amount) + IntegerEntry(key, staked + i.payments[0].amount), + IntegerEntry("index", index + 1) ] } diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index 7c442a8..2d474f7 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -25,7 +25,6 @@ | :------------------------------------------ | :------- | :--------------------------------- | | `%s%s__available__` | `Int` | Available LP Asset amount to Claim | | `%s%s__claimed__` | `Int` | LP Asset amount already claimed | -| `%s%s__swappedToPower__` | `Int` | Waves amount swapped to Power | | `%s%s%s__withdrawal____` | `String` | Withdrawal request parameters | ``` From baf27c79f892fc2b4b2492738f82593d6077ffd1 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Thu, 17 Aug 2023 09:43:40 +0300 Subject: [PATCH 128/143] New finalize arguments New price calculations Updated tests Updated specs --- contracts/calculator/calculator.ride | 113 +++++----------- .../calculator/test/claim_collateral.spec.js | 16 +-- .../test/claim_collateral_readonly.spec.js | 127 +++++++++--------- contracts/calculator/test/claim_waves.spec.js | 93 ------------- contracts/calculator/test/finalize.spec.js | 53 +++----- .../test/finalizeMultiPayment.spec.js | 23 ++-- contracts/factory/factory.md | 87 ++++++------ contracts/factory/factory.ride | 58 ++++---- 8 files changed, 214 insertions(+), 356 deletions(-) delete mode 100644 contracts/calculator/test/claim_waves.spec.js diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index ad3fd6d..3621338 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -46,6 +46,7 @@ func keyCurrentPeriod() = ["%s", "currentPeriod"].makeString(SEP) func keyPriceForPeriod(period: Int) = ["%s%d", "price", period.toString()].makeString(SEP) func keyStartHeight(period: Int) = ["%s%d", "startHeight", period.toString()].makeString(SEP) func keyPowerManagerBonus(period: Int) = ["%s%d", "powerManagerBonus", period.toString()].makeString(SEP) +func keyClaimWavesAmount(period: Int) = ["%s%d", "claimWavesAmount", period.toString()].makeString(SEP) func keyPeriodLength() = "%s__periodLength" func keyBlockProcessingReward() = "%s__blockProcessingReward" func keyNextBlockToProcess() = "%s__nextBlockToProcess" @@ -158,68 +159,24 @@ func rewardForOption(rewards: List[(Address, Int)], target: Address) = { } func finalizeINTERNAL( - newTreasuryVolumeInWaves: Int, - pwrManagersBonusInWaves: Int, - treasuryVolumeDiffAllocationCoef: Int + donationPartInWaves: Int, + lpPartInWaves: Int, + claimPartInWaves: Int, + powerStakePartInWaves: Int ) = { - let donatedWavesAmount = factoryAddressOrFail.getInteger( - keyDonated(unit) - ).valueOrElse(0) - let investedWavesAmount = factoryAddressOrFail.getInteger( - keyInvested(unit) - ).valueOrElse(0) - - let currentTreasuryVolumeInWaves = donatedWavesAmount + investedWavesAmount - let profitRaw = newTreasuryVolumeInWaves - currentTreasuryVolumeInWaves - - let pwrManagersBonusAmount = if (pwrManagersBonusInWaves <= profitRaw || pwrManagersBonusInWaves == 0) - then pwrManagersBonusInWaves - else throwErr("power bonus is more than profit") - let profit = profitRaw - pwrManagersBonusAmount - let donationPart = if (currentTreasuryVolumeInWaves > 0) - then fraction(donatedWavesAmount, SCALE8, currentTreasuryVolumeInWaves) - else 0 - let donationProfitPartRaw = fraction(profit, donationPart, SCALE8) - let investmentProfitPartRaw = profit - donationProfitPartRaw - let treasuryVolumeDiffAllocationCoefAbs = abs(treasuryVolumeDiffAllocationCoef) - let amountToDonation = fraction( - investmentProfitPartRaw, - if (treasuryVolumeDiffAllocationCoef < 0) then treasuryVolumeDiffAllocationCoefAbs else 0, - SCALE8 - ) - let amountToInvestment = fraction( - donationProfitPartRaw, - if (treasuryVolumeDiffAllocationCoef > 0) then treasuryVolumeDiffAllocationCoefAbs else 0, - SCALE8 - ) - let donationProfitPart = donationProfitPartRaw - amountToInvestment + amountToDonation - let investmentProfitPart = investmentProfitPartRaw - amountToDonation + amountToInvestment - - let donatedWavesAmountNewRaw = donatedWavesAmount + donationProfitPart - let investedWavesAmountNewRaw = investedWavesAmount + investmentProfitPart - - let donatedPartDebt = min([0, donatedWavesAmountNewRaw]) - let investedPartDebt = min([0, investedWavesAmountNewRaw]) - - let donatedWavesAmountNew = max([0, donatedWavesAmountNewRaw]) + investedPartDebt - let investedWavesAmountNew = max([0, investedWavesAmountNewRaw]) + donatedPartDebt - # calculate new price + let lpAssetAmountToBurn = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) let lpAssetQuantity = lpAssetIdOrFail.assetInfo() .valueOrErrorMessage(wrapErr("invalid lpAsset info")).quantity - let newPrice = fraction(investedWavesAmountNew, SCALE8, lpAssetQuantity) + let newPrice = fraction(lpPartInWaves, SCALE8, lpAssetQuantity - lpAssetAmountToBurn) strict checkIfPriceNotZero = (newPrice != 0) || throwErr("LP price cannot be 0") - let lpAssetAmountToBurn = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) - let paymentAmountMin = max([0, fraction(lpAssetAmountToBurn, newPrice, SCALE8)]) - - let finalInvestedWavesAmount = investedWavesAmountNew - paymentAmountMin let lpAssetFinalQuantity = lpAssetQuantity - lpAssetAmountToBurn ( - paymentAmountMin, - finalInvestedWavesAmount, - donatedWavesAmountNew, + claimPartInWaves, + lpPartInWaves, + donationPartInWaves, newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity @@ -296,17 +253,14 @@ func claimLP(userAddressBytes: ByteVector) = { (nil, factoryActions) } -# payment in waves to fulfill all withdrawal requests -# treasuryVolumeDiffAllocationCoef: -# [-1, 0) - profit to donation -# 0 - in proportion -# (0, 1] - profit to investment +# payment in any assets to fulfill all withdrawal requests @Callable(i) func finalize( userAddressBytes: ByteVector, - newTreasuryVolumeInWaves: Int, - pwrManagersBonusInWaves: Int, - treasuryVolumeDiffAllocationCoef: Int # -1..1×10⁸ + donationPartInWaves: Int, + lpPartInWaves: Int, + claimPartInWaves: Int, + powerStakePartInWaves: Int ) = { strict checkCaller = i.onlyFactory() let currentPeriodOrFail = @@ -330,13 +284,13 @@ func finalize( strict checks = [ i.originCaller == mainTreasuryAddressOrFail || throwErr("permission denied"), nextBlockToProcess > periodEndHeight || throwErr("unprocessed blocks"), - newTreasuryVolumeInWaves >= 0 || throwErr("invalid new treasury volume"), - pwrManagersBonusInWaves >= 0 || throwErr("invalid PWR managers bonus"), - treasuryVolumeDiffAllocationCoef >= -SCALE8 && treasuryVolumeDiffAllocationCoef <= SCALE8 - || throwErr("invalid treasury volume diff allocation coefficient") + donationPartInWaves >= 0 || throwErr("invalid donation part"), + lpPartInWaves >= 0 || throwErr("invalid lp part"), + claimPartInWaves >= 0 || throwErr("invalid claim part"), + powerStakePartInWaves >= 0 || throwErr("invalid PWR stake part") ] - # Finalize calcualtions + # Finalize calculations let ( paymentAmountMin, finalInvestedWavesAmount, @@ -344,7 +298,7 @@ func finalize( newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity - ) = finalizeINTERNAL(newTreasuryVolumeInWaves, pwrManagersBonusInWaves, treasuryVolumeDiffAllocationCoef) + ) = finalizeINTERNAL(donationPartInWaves, lpPartInWaves, claimPartInWaves, powerStakePartInWaves) let newPeriod = currentPeriodOrFail + 1 @@ -365,7 +319,11 @@ func finalize( let factoryActions = [ # write power manager bonus factoryAddressOrFail.invoke( - "integerEntry", [keyPowerManagerBonus(currentPeriodOrFail), pwrManagersBonusInWaves], [] + "integerEntry", [keyPowerManagerBonus(currentPeriodOrFail), powerStakePartInWaves], [] + ), + # write claim amount in waves + factoryAddressOrFail.invoke( + "integerEntry", [keyClaimWavesAmount(currentPeriodOrFail), claimPartInWaves], [] ), # update period factoryAddressOrFail.invoke("integerEntry", [keyCurrentPeriod(), newPeriod], []), @@ -398,9 +356,10 @@ func finalize( # @Callable(i) func finalizeREADONLY( - newTreasuryVolumeInWaves: Int, - pwrManagersBonusInWaves: Int, - treasuryVolumeDiffAllocationCoef: Int # -1..1×10⁸ + donationPartInWaves: Int, + lpPartInWaves: Int, + claimPartInWaves: Int, + powerStakePartInWaves: Int ) = { let currentPeriodOrFail = factoryAddressOrFail.getInteger(keyCurrentPeriod()) @@ -422,14 +381,14 @@ func finalizeREADONLY( strict checks = [ nextBlockToProcess > periodEndHeight || throwErr("unprocessed blocks"), - newTreasuryVolumeInWaves >= 0 || throwErr("invalid new treasury volume"), - pwrManagersBonusInWaves >= 0 || throwErr("invalid PWR managers bonus"), - treasuryVolumeDiffAllocationCoef >= -SCALE8 && treasuryVolumeDiffAllocationCoef <= SCALE8 - || throwErr("invalid treasury volume diff allocation coefficient") + donationPartInWaves >= 0 || throwErr("invalid donation part"), + lpPartInWaves >= 0 || throwErr("invalid lp part"), + claimPartInWaves >= 0 || throwErr("invalid claim part"), + powerStakePartInWaves >= 0 || throwErr("invalid PWR stake part") ] - # Finalize calcualtions - ([], finalizeINTERNAL(newTreasuryVolumeInWaves, pwrManagersBonusInWaves, treasuryVolumeDiffAllocationCoef)) + # Finalize calculations + ([], finalizeINTERNAL(donationPartInWaves, lpPartInWaves, claimPartInWaves, powerStakePartInWaves)) } # payment in waves diff --git a/contracts/calculator/test/claim_collateral.spec.js b/contracts/calculator/test/claim_collateral.spec.js index 4dd604f..a8b80e9 100644 --- a/contracts/calculator/test/claim_collateral.spec.js +++ b/contracts/calculator/test/claim_collateral.spec.js @@ -110,18 +110,20 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { chainId }, accounts.user1.seed)) - const newTreasuryVolumeInWaves = 1100 * 1e8 + const newDonatedInWaves = 2000 * 1e8 + const newLpInWaves = 1000 * 1e8 + const claimAmountInWaves = 100 * 1e8 const pwrManagersBonusInWaves = 100 * 1e8 - const treasuryVolumeDiffAllocationCoef = 0 const [{ quantity }] = await api.assets.fetchDetails([lpAssetId]) await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, call: { function: 'finalize', args: [ - { type: 'integer', value: newTreasuryVolumeInWaves }, - { type: 'integer', value: pwrManagersBonusInWaves }, - { type: 'integer', value: treasuryVolumeDiffAllocationCoef } + { type: 'integer', value: newDonatedInWaves }, + { type: 'integer', value: newLpInWaves }, + { type: 'integer', value: claimAmountInWaves }, + { type: 'integer', value: pwrManagersBonusInWaves } ] }, payment: [ @@ -147,9 +149,7 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { const stateChangesTransfers = stateChanges.invokes[0].stateChanges.invokes[2].stateChanges.transfers const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') - const profitRaw = newTreasuryVolumeInWaves - investedWavesAmount - const profit = profitRaw - pwrManagersBonusInWaves - const expectedPrice = Math.floor((investedWavesAmount + profit) * scale8 / quantity) + const expectedPrice = Math.floor(newLpInWaves * scale8 / (quantity - paymentAmount)) expect(price).to.equal(expectedPrice) expect(stateChangesTransfers).to.deep.equal([ { diff --git a/contracts/calculator/test/claim_collateral_readonly.spec.js b/contracts/calculator/test/claim_collateral_readonly.spec.js index a8e6c52..e88c7ff 100644 --- a/contracts/calculator/test/claim_collateral_readonly.spec.js +++ b/contracts/calculator/test/claim_collateral_readonly.spec.js @@ -1,73 +1,73 @@ -import chai from "chai"; -import chaiAsPromised from "chai-as-promised"; +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' import { api, chainId, broadcastAndWait, - baseSeed, -} from "../../../utils/api.js"; -import { setup } from "./_setup.js"; -import { invokeScript, transfer, issue } from "@waves/waves-transactions"; + baseSeed +} from '../../../utils/api.js' +import { setup } from './_setup.js' +import { invokeScript, transfer, issue } from '@waves/waves-transactions' -chai.use(chaiAsPromised); -const { expect } = chai; +chai.use(chaiAsPromised) +const { expect } = chai -const scale8 = 1e8; +const scale8 = 1e8 describe(`[${process.pid}] calculator: claim collateral readonly`, () => { - let accounts, lpAssetId, investedWavesAmount; + let accounts, lpAssetId, investedWavesAmount before(async () => { - const { height } = await api.blocks.fetchHeight(); + const { height } = await api.blocks.fetchHeight() investedWavesAmount = 500 * 1e8; ({ accounts, lpAssetId } = await setup({ investedWavesAmount, nextBlockToProcess: height, - periodLength: 1, - })); + periodLength: 1 + })) await broadcastAndWait( invokeScript( { dApp: accounts.factory.address, - call: { function: "processBlocks", args: [] }, - chainId, + call: { function: 'processBlocks', args: [] }, + chainId }, accounts.user1.seed ) - ); + ) - const paymentAmount = 1e8; - investedWavesAmount += paymentAmount; + const paymentAmount = 1e8 + investedWavesAmount += paymentAmount await broadcastAndWait( invokeScript( { dApp: accounts.factory.address, - call: { function: "invest", args: [] }, + call: { function: 'invest', args: [] }, payment: [{ assetId: null, amount: paymentAmount }], - chainId, + chainId }, accounts.user1.seed ) - ); - }); + ) + }) - it("user should successfully claim assets after finalization", async () => { - const paymentAmount = 1e8; + it('user should successfully evaluate claimCollateralREADONLY', async () => { + const paymentAmount = 1e8 const { id: firstAssetId } = await broadcastAndWait( issue( { - name: "FirstAsset", - description: "", + name: 'FirstAsset', + description: '', quantity: 10e8, decimals: 8, reissuable: true, - chainId, + chainId }, baseSeed ) - ); + ) await broadcastAndWait( transfer( @@ -75,25 +75,25 @@ describe(`[${process.pid}] calculator: claim collateral readonly`, () => { recipient: accounts.mainTreasury.address, amount: 10e8, assetId: firstAssetId, - additionalFee: 4e5, + additionalFee: 4e5 }, baseSeed ) - ); + ) const { id: secondAssetId } = await broadcastAndWait( issue( { - name: "SecondAsset", - description: "", + name: 'SecondAsset', + description: '', quantity: 10e8, decimals: 8, reissuable: true, - chainId, + chainId }, baseSeed ) - ); + ) await broadcastAndWait( transfer( @@ -101,25 +101,25 @@ describe(`[${process.pid}] calculator: claim collateral readonly`, () => { recipient: accounts.mainTreasury.address, amount: 10e8, assetId: secondAssetId, - additionalFee: 4e5, + additionalFee: 4e5 }, baseSeed ) - ); + ) const { id: thirdAssetId } = await broadcastAndWait( issue( { - name: "ThirdAsset", - description: "", + name: 'ThirdAsset', + description: '', quantity: 10e8, decimals: 8, reissuable: true, - chainId, + chainId }, baseSeed ) - ); + ) await broadcastAndWait( transfer( @@ -127,64 +127,65 @@ describe(`[${process.pid}] calculator: claim collateral readonly`, () => { recipient: accounts.mainTreasury.address, amount: 10e8, assetId: thirdAssetId, - additionalFee: 4e5, + additionalFee: 4e5 }, baseSeed ) - ); + ) const { id: withdrawTxId } = await broadcastAndWait( invokeScript( { dApp: accounts.factory.address, - call: { function: "withdraw", args: [] }, + call: { function: 'withdraw', args: [] }, payment: [{ assetId: lpAssetId, amount: paymentAmount }], - chainId, + chainId }, accounts.user1.seed ) - ); + ) - const newTreasuryVolumeInWaves = 1100 * 1e8; - const pwrManagersBonusInWaves = 100 * 1e8; - const treasuryVolumeDiffAllocationCoef = 0; - const [{ quantity }] = await api.assets.fetchDetails([lpAssetId]); + const newDonatedInWaves = 1000 * 1e8 + const newLpInWaves = 100 * 1e8 + const claimAmountInWaves = 100 * 1e8 + const pwrManagersBonusInWaves = 100 * 1e8 await broadcastAndWait( invokeScript( { dApp: accounts.factory.address, call: { - function: "finalize", + function: 'finalize', args: [ - { type: "integer", value: newTreasuryVolumeInWaves }, - { type: "integer", value: pwrManagersBonusInWaves }, - { type: "integer", value: treasuryVolumeDiffAllocationCoef }, - ], + { type: 'integer', value: newDonatedInWaves }, + { type: 'integer', value: newLpInWaves }, + { type: 'integer', value: claimAmountInWaves }, + { type: 'integer', value: pwrManagersBonusInWaves } + ] }, payment: [ { assetId: firstAssetId, amount: paymentAmount }, { assetId: secondAssetId, amount: paymentAmount }, - { assetId: thirdAssetId, amount: paymentAmount }, + { assetId: thirdAssetId, amount: paymentAmount } ], chainId, - additionalFee: 4e5, + additionalFee: 4e5 }, accounts.mainTreasury.seed ) - ); + ) - const expr = `claimCollateralREADONLY(\"${accounts.user1.address}\", \"${withdrawTxId}\")`; + const expr = `claimCollateralREADONLY("${accounts.user1.address}", "${withdrawTxId}")` const response = await api.utils.fetchEvaluate( accounts.factory.address, expr - ); + ) const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') const wavesAmount = Math.floor(paymentAmount * price / scale8) - const responseString = response.result.value._2.value; + const responseString = response.result.value._2.value const expectedString = `%d%s%s__${wavesAmount}__${firstAssetId}:${secondAssetId}:${thirdAssetId}__${paymentAmount}:${paymentAmount}:${paymentAmount}` - expect(responseString).to.eql(expectedString); - }); -}); + expect(responseString).to.eql(expectedString) + }) +}) diff --git a/contracts/calculator/test/claim_waves.spec.js b/contracts/calculator/test/claim_waves.spec.js deleted file mode 100644 index 17c3c79..0000000 --- a/contracts/calculator/test/claim_waves.spec.js +++ /dev/null @@ -1,93 +0,0 @@ -import chai from 'chai' -import chaiAsPromised from 'chai-as-promised' -import { api, chainId, broadcastAndWait } from '../../../utils/api.js' -import { setup } from './_setup.js' -import { invokeScript } from '@waves/waves-transactions' - -chai.use(chaiAsPromised) -const { expect } = chai - -const scale8 = 1e8 - -describe(`[${process.pid}] calculator: claim waves`, () => { - let accounts, lpAssetId, investedWavesAmount - - before(async () => { - const { height } = await api.blocks.fetchHeight() - investedWavesAmount = 500 * 1e8; - ({ accounts, lpAssetId } = await setup({ - investedWavesAmount, - nextBlockToProcess: height, - periodLength: 1 - })) - - await broadcastAndWait(invokeScript({ - dApp: accounts.factory.address, - call: { function: 'processBlocks', args: [] }, - chainId - }, accounts.user1.seed)) - - const paymentAmount = 1e8 - investedWavesAmount += paymentAmount - await broadcastAndWait(invokeScript({ - dApp: accounts.factory.address, - call: { function: 'invest', args: [] }, - payment: [{ assetId: null, amount: paymentAmount }], - chainId - }, accounts.user1.seed)) - }) - - it('user should successfully claim waves after finalization', async () => { - const paymentAmount = 1e8 - const { id: withdrawTxId } = await broadcastAndWait(invokeScript({ - dApp: accounts.factory.address, - call: { function: 'withdraw', args: [] }, - payment: [{ assetId: lpAssetId, amount: paymentAmount }], - chainId - }, accounts.user1.seed)) - - const finalizePaymentAmount = 198809133 - const newTreasuryVolumeInWaves = 1100 * 1e8 - const pwrManagersBonusInWaves = 100 * 1e8 - const treasuryVolumeDiffAllocationCoef = 0 - const [{ quantity }] = await api.assets.fetchDetails([lpAssetId]) - await broadcastAndWait(invokeScript({ - dApp: accounts.factory.address, - call: { - function: 'finalize', - args: [ - { type: 'integer', value: newTreasuryVolumeInWaves }, - { type: 'integer', value: pwrManagersBonusInWaves }, - { type: 'integer', value: treasuryVolumeDiffAllocationCoef } - ] - }, - payment: [{ assetId: null, amount: finalizePaymentAmount }], - chainId, - additionalFee: 4e5 - }, accounts.mainTreasury.seed)) - - const { stateChanges } = await broadcastAndWait(invokeScript({ - dApp: accounts.factory.address, - call: { - function: 'claimCollateral', - args: [ - { type: 'string', value: withdrawTxId } - ] - }, - chainId - }, accounts.user1.seed)) - - const transfer = stateChanges.invokes[0].stateChanges.invokes[2].stateChanges.transfers[0] - - const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') - const profitRaw = newTreasuryVolumeInWaves - investedWavesAmount - const profit = profitRaw - pwrManagersBonusInWaves - const expectedPrice = Math.floor((investedWavesAmount + profit) * scale8 / quantity) - expect(price).to.equal(expectedPrice) - expect(transfer).to.deep.equal({ - address: accounts.user1.address, - asset: null, - amount: Math.floor(paymentAmount * price / scale8) - }) - }) -}) diff --git a/contracts/calculator/test/finalize.spec.js b/contracts/calculator/test/finalize.spec.js index c3fab1f..3af36fe 100644 --- a/contracts/calculator/test/finalize.spec.js +++ b/contracts/calculator/test/finalize.spec.js @@ -13,12 +13,12 @@ describe(`[${process.pid}] calculator: finalize`, () => { let accounts, lpAssetId const paymentAmount = 1 const periodLength = 1 - const periodReward = 2 * 1e8 - const newTreasuryVolumeInWaves = 10000 * 1e8 - const pwrManagersBonusInWaves = 700 * 1e8 - const treasuryVolumeDiffAllocationCoef = -0.5 - const initialInvestInWaves = 5000 * 1e8 + const initialLpInWaves = 5000 * 1e8 const initialDonatedInWaves = 3000 * 1e8 + const newLpInWaves = 6000 * 1e8 + const newDonatedIntWaves = 2500 * 1e8 + const claimAmountInWaves = 0 * 1e8 + const pwrManagersBonusInWaves = 700 * 1e8 const blockProcessingReward = 0.015 * 1e8 before(async () => { @@ -27,7 +27,7 @@ describe(`[${process.pid}] calculator: finalize`, () => { nextBlockToProcess: height, periodLength, blockProcessingReward, - investedWavesAmount: initialInvestInWaves, + investedWavesAmount: initialLpInWaves, donatedWavesAmount: initialDonatedInWaves })) }) @@ -38,9 +38,10 @@ describe(`[${process.pid}] calculator: finalize`, () => { call: { function: 'finalize', args: [ - { type: 'integer', value: newTreasuryVolumeInWaves }, - { type: 'integer', value: pwrManagersBonusInWaves }, - { type: 'integer', value: treasuryVolumeDiffAllocationCoef * scale8 } + { type: 'integer', value: newDonatedIntWaves }, + { type: 'integer', value: newLpInWaves }, + { type: 'integer', value: claimAmountInWaves }, + { type: 'integer', value: pwrManagersBonusInWaves } ] }, payment: [], @@ -54,9 +55,10 @@ describe(`[${process.pid}] calculator: finalize`, () => { call: { function: 'finalize', args: [ - { type: 'integer', value: newTreasuryVolumeInWaves }, - { type: 'integer', value: pwrManagersBonusInWaves }, - { type: 'integer', value: treasuryVolumeDiffAllocationCoef * scale8 } + { type: 'integer', value: newDonatedIntWaves }, + { type: 'integer', value: newLpInWaves }, + { type: 'integer', value: claimAmountInWaves }, + { type: 'integer', value: pwrManagersBonusInWaves } ] }, payment: [{ assetId: null, amount: paymentAmount }], @@ -79,9 +81,10 @@ describe(`[${process.pid}] calculator: finalize`, () => { call: { function: 'finalize', args: [ - { type: 'integer', value: newTreasuryVolumeInWaves }, - { type: 'integer', value: pwrManagersBonusInWaves }, - { type: 'integer', value: treasuryVolumeDiffAllocationCoef * scale8 } + { type: 'integer', value: newDonatedIntWaves }, + { type: 'integer', value: newLpInWaves }, + { type: 'integer', value: claimAmountInWaves }, + { type: 'integer', value: pwrManagersBonusInWaves } ] }, payment: [{ assetId: null, amount: paymentAmount }], @@ -94,25 +97,7 @@ describe(`[${process.pid}] calculator: finalize`, () => { const [{ quantity }] = await api.assets.fetchDetails([lpAssetId]) const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') - const totalReward = periodLength * periodReward - blockProcessingReward - const totalInvestAmount = initialInvestInWaves + totalReward - const totalInvestAndDonation = initialDonatedInWaves + totalInvestAmount - const profitOrLoss = newTreasuryVolumeInWaves - totalInvestAndDonation - const rawProfit = profitOrLoss - (pwrManagersBonusInWaves <= profitOrLoss ? pwrManagersBonusInWaves : 0) - - const donationPart = initialDonatedInWaves / totalInvestAndDonation - const investPart = totalInvestAmount / totalInvestAndDonation - const donatedRawProfit = rawProfit * donationPart - const investRawProfit = rawProfit * investPart - let investProfit = investRawProfit - if (treasuryVolumeDiffAllocationCoef < 0) { - investProfit = investRawProfit * (1 - Math.abs(treasuryVolumeDiffAllocationCoef)) - } - if (treasuryVolumeDiffAllocationCoef > 0) { - investProfit = investRawProfit + donatedRawProfit * Math.abs(treasuryVolumeDiffAllocationCoef) - } - - const expectedPrice = Math.floor((totalInvestAmount + investProfit) * scale8 / quantity) + const expectedPrice = Math.floor(newLpInWaves * scale8 / quantity) expect(price, 'invalid price').to.equal(expectedPrice) const expectedFactoryBalance = factoryBalanceBefore + paymentAmount expect(factoryBalanceAfter, 'invalid factory balance').to.equal(expectedFactoryBalance) diff --git a/contracts/calculator/test/finalizeMultiPayment.spec.js b/contracts/calculator/test/finalizeMultiPayment.spec.js index 0364798..d2e2c01 100644 --- a/contracts/calculator/test/finalizeMultiPayment.spec.js +++ b/contracts/calculator/test/finalizeMultiPayment.spec.js @@ -7,17 +7,16 @@ import { invokeScript, transfer, issue } from '@waves/waves-transactions' chai.use(chaiAsPromised) const { expect } = chai -const scale8 = 1e8 - describe(`[${process.pid}] calculator: finalizeMultiPayment`, () => { let accounts const paymentAmount = 1 const periodLength = 1 - const newTreasuryVolumeInWaves = 10000 * 1e8 - const pwrManagersBonusInWaves = 700 * 1e8 - const treasuryVolumeDiffAllocationCoef = -0.5 - const initialInvestInWaves = 5000 * 1e8 + const initialLpInWaves = 5000 * 1e8 const initialDonatedInWaves = 3000 * 1e8 + const newLpInWaves = 6000 * 1e8 + const newDonatedIntWaves = 2500 * 1e8 + const claimAmountInWaves = 0 * 1e8 + const pwrManagersBonusInWaves = 700 * 1e8 const blockProcessingReward = 0.015 * 1e8 before(async () => { @@ -26,7 +25,7 @@ describe(`[${process.pid}] calculator: finalizeMultiPayment`, () => { nextBlockToProcess: height, periodLength, blockProcessingReward, - investedWavesAmount: initialInvestInWaves, + investedWavesAmount: initialLpInWaves, donatedWavesAmount: initialDonatedInWaves })) }) @@ -128,12 +127,10 @@ describe(`[${process.pid}] calculator: finalizeMultiPayment`, () => { call: { function: 'finalize', args: [ - { type: 'integer', value: newTreasuryVolumeInWaves }, - { type: 'integer', value: pwrManagersBonusInWaves }, - { - type: 'integer', - value: treasuryVolumeDiffAllocationCoef * scale8 - } + { type: 'integer', value: newDonatedIntWaves }, + { type: 'integer', value: newLpInWaves }, + { type: 'integer', value: claimAmountInWaves }, + { type: 'integer', value: pwrManagersBonusInWaves } ] }, payment: [ diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index 33ecf9e..a96705e 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -1,19 +1,24 @@ ### Required state entries -| key | type | description | -| :---------------------------- | :------- | :---------------------------- | -| `%s__calculator` | `String` | Calculator Address | -| `%s__proxyTreasury` | `String` | Proxy Treasury Address | -| `%s__mainTreasury` | `String` | Main Treasury Address | -| `%s__config` | `String` | DAO Config address | -| `%s__lpAssetId` | `String` | LP Asset ID | -| `%s__currentPeriod` | `Int` | Current period num | -| `%s__periodLength` | `Int` | Period length in blocks | -| `%s%s__invested__WAVES` | `Int` | Invested Amount in Waves | -| `%s%s__donated__WAVES` | `Int` | Donated Amount in Waves | -| `%s%d__startHeight__` | `Int` | Starting Height of `` | -| `%s%d__price__` | `Int` | LP Asset Price for `` | -| `%s__nextBlockToProcess` | `Int` | Next block height to process | +| key | type | description | +| :---------------------------------- | :------- | :-------------------------------------- | +| `%s__calculator` | `String` | Calculator Address | +| `%s__proxyTreasury` | `String` | Proxy Treasury Address | +| `%s__mainTreasury` | `String` | Main Treasury Address | +| `%s__businessTreasury` | `String` | Business Treasury Address | +| `%s__config` | `String` | DAO Config address | +| `%s__lpAssetId` | `String` | LP Asset ID | +| `%s__currentPeriod` | `Int` | Current period num | +| `%s__withdrawal` | `Int` | LP amount to withdraw in current period | +| `%s__periodLength` | `Int` | Period length in blocks | +| `%s__businessTreasuryPart` | `Int` | Business Treasury share part | +| `%s%s__invested__WAVES` | `Int` | Invested Amount in Waves | +| `%s%s__donated__WAVES` | `Int` | Donated Amount in Waves | +| `%s%d__startHeight__` | `Int` | Starting Height of `` | +| `%s%d__price__` | `Int` | LP Asset Price for `` | +| `%s%d__powerManagerBonus__` | `Int` | PWR Stake part in Waves for `` | +| `%s%d__claimWavesAmount__` | `Int` | Claim amount in Waves for `` | +| `%s__nextBlockToProcess` | `Int` | Next block height to process | ### User state @@ -69,13 +74,19 @@ Cancel withdraw request. func cancelWithdraw(txIdStr: String) ``` -#### Claim Waves +#### Claim Collateral -Claim Waves from withdraw request at current price. +Claim Collateral from withdraw request `txIdStr` - withdraw request TxId ``` -func claimWaves(txIdStr: String) +@Callable(i) +func claimCollateral(txIdStr: String) +``` + +``` +@Callable(i) +func claimCollateralREADONLY(userAddress: String, txIdStr: String) ``` --- @@ -94,17 +105,13 @@ func processBlocks() ### Finalize evaluation Evaluate finalization results and required Waves amount to finish finalization. Arguments: -- `newTreasuryVolumeInWaves` - Total treasury volume in Waves, include Invested and Donated amounts -- `pwrManagersBonusInWaves` - Power Manager bonus in Waves, this amount is deducted from Total profit when LP Price is calculated -- `treasuryVolumeDiffAllocationCoef` - Allocation coefficient ([-100000000; 100000000]), Profit/Loss distribution proportion. - - `0` - Profit/Loss distributed to Invested and Donated evenly by their amounts proportions - - `-100000000` All Profit/Loss is allocated to Donated part - - `100000000` All Profit/Loss is allocated to Invested part - - `-60000000` 60% of Invested Profit/Loss part is added to Donated part - - `44000000` 44% of Donated Profit/Loss part is added to Invested part +- `donationPartInWaves` - New Donated part value in Waves +- `lpPartInWaves` - New LP part in Waves +- `claimPartInWaves` - Claim amount in Waves +- `powerStakePartInWaves` - PWR stake part in Waves Return values: -- `_1 = wavesToClaimPaymentAmount` - amount of Waves in payment needed to finish finalization +- `_1 = wavesToClaimAmount` - claim amount in waves - `_2 = newInvestedWavesAmount` - new Invested Waves amount after finalization - `_3 = newDonatedWavesAmountNew` - new Donated Waves amount after finalization - `_4 = newPrice` - new Price for next Period @@ -114,9 +121,10 @@ Return values: ``` @Callable(i) func finalizeREADONLY( - newTreasuryVolumeInWaves: Int, - pwrManagersBonusInWaves: Int, - treasuryVolumeDiffAllocationCoef: Int + donationPartInWaves: Int, + lpPartInWaves: Int, + claimPartInWaves: Int, + powerStakePartInWaves: Int ) ``` @@ -125,25 +133,22 @@ func finalizeREADONLY( ### Finalization Finalize current period and calculate new Price. -- Payment should include exact Waves amount needed to process all withdrawal requests. +- Payment should include payments in any assets to process withdrawal requests. - Can only be called by Main Treasury Arguments: -- `newTreasuryVolumeInWaves` - Total treasury volume in Waves, include Invested and Donated amounts -- `pwrManagersBonusInWaves` - Power Manager bonus in Waves, this amount is deducted from Total profit when LP Price is calculated -- `treasuryVolumeDiffAllocationCoef` - Allocation coefficient ([-100000000; 100000000]), Profit/Loss distribution proportion. - - `0` - Profit/Loss distributed to Invested and Donated evenly by their amounts proportions - - `-100000000` All Profit/Loss is allocated to Donated part - - `100000000` All Profit/Loss is allocated to Invested part - - `-60000000` 60% of Invested Profit/Loss part is added to Donated part - - `44000000` 44% of Donated Profit/Loss part is added to Invested part +- `donationPartInWaves` - New Donated part value in Waves +- `lpPartInWaves` - New LP part in Waves +- `claimPartInWaves` - Claim amount in Waves +- `powerStakePartInWaves` - PWR stake part in Waves ``` @Callable(i) func finalize( - newTreasuryVolumeInWaves: Int, - pwrManagersBonusInWaves: Int, - treasuryVolumeDiffAllocationCoef: Int + donationPartInWaves: Int, + lpPartInWaves: Int, + claimPartInWaves: Int, + powerStakePartInWaves: Int ) ``` diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index da85928..8d7ea13 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -221,17 +221,17 @@ func burn(amount: Int) = if (i.onlyCalculator()) then ([Burn(lpAssetIdOrFail, amount)], amount) else ([], unit) @Callable(i) -func transferAsset(recepientBytes: ByteVector, amount: Int, assetId: ByteVector) = - if (i.onlyCalculator()) then ([ScriptTransfer(Address(recepientBytes), amount, assetId)], amount) else ([], unit) +func transferAsset(recipientBytes: ByteVector, amount: Int, assetId: ByteVector) = + if (i.onlyCalculator()) then ([ScriptTransfer(Address(recipientBytes), amount, assetId)], amount) else ([], unit) @Callable(i) -func transferAssets(recepientBytes: ByteVector, assetsList: List[String], amountsList: List[String]) = { +func transferAssets(recipientBytes: ByteVector, assetsList: List[String], amountsList: List[String]) = { if (i.onlyCalculator()) then { - func addNewTransfer(accum: (List[ScriptTransfer], Int), nextAssetId: String) = { - let (transfers, j) = accum + func addNewTransfer(acc: (List[ScriptTransfer], Int), nextAssetId: String) = { + let (transfers, j) = acc let newTransfer = ScriptTransfer( - Address(recepientBytes), + Address(recipientBytes), amountsList[j].parseIntValue(), assetsList[j].stringToAssetId() ) @@ -247,8 +247,8 @@ func transferAssets(recepientBytes: ByteVector, assetsList: List[String], amount } @Callable(i) -func transferWaves(recepientBytes: ByteVector, amount: Int) = - if (i.onlyCalculator()) then ([ScriptTransfer(Address(recepientBytes), amount, unit)], amount) else ([], unit) +func transferWaves(recipientBytes: ByteVector, amount: Int) = + if (i.onlyCalculator()) then ([ScriptTransfer(Address(recipientBytes), amount, unit)], amount) else ([], unit) @Callable(i) func transferFromProxyTreasury(recipientBytes: ByteVector, rewardsAmount: Int) = @@ -257,9 +257,10 @@ func transferFromProxyTreasury(recipientBytes: ByteVector, rewardsAmount: Int) = # finalize period @Callable(i) func finalize( - newTreasuryVolumeInWaves: Int, - pwrManagersBonusInWaves: Int, - treasuryVolumeDiffAllocationCoef: Int + donationPartInWaves: Int, + lpPartInWaves: Int, + claimPartInWaves: Int, + powerStakePartInWaves: Int ) = { ( nil, @@ -267,9 +268,10 @@ func finalize( "finalize", [ i.caller.bytes, - newTreasuryVolumeInWaves, - pwrManagersBonusInWaves, - treasuryVolumeDiffAllocationCoef + donationPartInWaves, + lpPartInWaves, + claimPartInWaves, + powerStakePartInWaves ], i.payments ) @@ -278,7 +280,7 @@ func finalize( # Returned values: # -# _1 = wavesToClaimPaymentAmount +# _1 = wavesToClaimAmount # _2 = newInvestedWavesAmount # _3 = newDonatedWavesAmountNew # _4 = newPrice @@ -287,18 +289,20 @@ func finalize( # @Callable(i) func finalizeREADONLY( - newTreasuryVolumeInWaves: Int, - pwrManagersBonusInWaves: Int, - treasuryVolumeDiffAllocationCoef: Int + donationPartInWaves: Int, + lpPartInWaves: Int, + claimPartInWaves: Int, + powerStakePartInWaves: Int ) = { ( nil, calculatorAddressOrFail.reentrantInvoke( "finalizeREADONLY", [ - newTreasuryVolumeInWaves, - pwrManagersBonusInWaves, - treasuryVolumeDiffAllocationCoef + donationPartInWaves, + lpPartInWaves, + claimPartInWaves, + powerStakePartInWaves ], [] ) ) @@ -336,9 +340,9 @@ func claimCollateralREADONLY(userAddress: String, txIdStr: String) = { )) } -##################### -# MUTISIG FUNCTIONS # -##################### +###################### +# MULTISIG FUNCTIONS # +###################### # Vote for txId that is allowed in Verifier @Callable(i) func voteForTxId(txId: String) = { @@ -354,9 +358,9 @@ func voteForTxId(txId: String) = { voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result) } -######################### -# MUTISIG FUNCTIONS END # -######################### +########################## +# MULTISIG FUNCTIONS END # +########################## @Verifier(tx) func verify() = { From 43be539d75d469ea3ca6bc5c111c74ec3e32f65e Mon Sep 17 00:00:00 2001 From: Epic waves rider <108883923+epicwavesrider@users.noreply.github.com> Date: Thu, 17 Aug 2023 20:13:20 +0800 Subject: [PATCH 129/143] feat: claimCollateral + investPeriod --- contracts/calculator/calculator.ride | 44 +++++++++++++-------- contracts/calculator/test/_setup.js | 2 + contracts/factory/factory.md | 59 ++++++++++++++++++++-------- contracts/factory/factory.ride | 16 +++++++- 4 files changed, 85 insertions(+), 36 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index ad3fd6d..435f69f 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -47,6 +47,7 @@ func keyPriceForPeriod(period: Int) = ["%s%d", "price", period.toString()].makeS func keyStartHeight(period: Int) = ["%s%d", "startHeight", period.toString()].makeString(SEP) func keyPowerManagerBonus(period: Int) = ["%s%d", "powerManagerBonus", period.toString()].makeString(SEP) func keyPeriodLength() = "%s__periodLength" +func keyInvestPeriodLength() = "%s__investPeriodLength" func keyBlockProcessingReward() = "%s__blockProcessingReward" func keyNextBlockToProcess() = "%s__nextBlockToProcess" func keyBlockProcessed(height: Int) = ["%s%d", "blockProcessed", height.toString()].makeString(SEP) @@ -226,7 +227,7 @@ func finalizeINTERNAL( ) } -func claimCollateralINTERNAL(userAddressBytes: ByteVector, txId: ByteVector, transactionId: ByteVector) = { +func claimCollateralINTERNAL(userAddressBytes: ByteVector, txId: ByteVector) = { let userAddress = Address(userAddressBytes) let currentPeriodOrFail = factoryAddressOrFail.getInteger(keyCurrentPeriod()).valueOrErrorMessage(wrapErr("invalid period")) @@ -252,7 +253,7 @@ func claimCollateralINTERNAL(userAddressBytes: ByteVector, txId: ByteVector, tra } } -func claimCollateralREADONLYStringResponse(userAddressBytes: ByteVector, txId: ByteVector, transactionId: ByteVector) = { +func claimCollateralREADONLYStringResponse(userAddressBytes: ByteVector, txId: ByteVector) = { let ( userAddress, lpAssetAmount, @@ -260,7 +261,7 @@ func claimCollateralREADONLYStringResponse(userAddressBytes: ByteVector, txId: B wavesAmount, assetsString, amountsString - ) = claimCollateralINTERNAL(userAddressBytes, txId, transactionId) + ) = claimCollateralINTERNAL(userAddressBytes, txId) let assets = assetsString.split_51C(SEP).removeByIndex(0).makeString(":") let amounts = amountsString.split_51C(SEP).removeByIndex(0).makeString(":") @@ -440,6 +441,15 @@ func invest(userAddressBytes: ByteVector) = { let currentPeriodOrFail = factoryAddressOrFail.getInteger(keyCurrentPeriod()) .valueOrErrorMessage(wrapErr("invalid period")) + let currentStartHeight = factoryAddressOrFail + .getInteger(keyStartHeight(currentPeriodOrFail)) + .valueOrErrorMessage(wrapErr("invalid start height")) + + let investPeriodLength = factoryAddressOrFail.getIntegerValue(keyInvestPeriodLength()) + + strict heightCheck = + height < currentStartHeight + investPeriodLength || throwErr("too late to invest in this period") + let currentPriceOrFail = factoryAddressOrFail.getInteger(keyPriceForPeriod(currentPeriodOrFail)) .valueOrErrorMessage(wrapErr("invalid price")) @@ -546,7 +556,7 @@ func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { } @Callable(i) -func claimCollateral(userAddressBytes: ByteVector, txId: ByteVector) = { +func claimCollateral(userAddressBytes: ByteVector, txId: String) = { strict checkCaller = i.onlyFactory() let ( @@ -556,17 +566,17 @@ func claimCollateral(userAddressBytes: ByteVector, txId: ByteVector) = { wavesAmount, assetsString, amountsString - ) = claimCollateralINTERNAL(userAddressBytes, txId, i.transactionId) + ) = claimCollateralINTERNAL(userAddressBytes, txId.fromBase58String()) let assetsList = assetsString.split_51C(SEP).removeByIndex(0) let amountsList = amountsString.split_51C(SEP).removeByIndex(0) let factoryActions = [ factoryAddressOrFail.invoke("deleteEntry", [ - keyWithdrawalRequest(userAddress, txId) + keyWithdrawalRequest(userAddress, txId.fromBase58String()) ], []), factoryAddressOrFail.invoke("integerEntry", [ - keyWithdrawalHistory(userAddress, txId), + keyWithdrawalHistory(userAddress, txId.fromBase58String()), lpAssetAmount ], []), factoryAddressOrFail.invoke("transferAssets", [userAddressBytes, assetsList, amountsList], []) @@ -576,10 +586,10 @@ func claimCollateral(userAddressBytes: ByteVector, txId: ByteVector) = { } @Callable(i) -func claimCollateralBulk(userAddressBytes: ByteVector, txIds: List[ByteVector]) = { +func claimCollateralBulk(userAddressBytes: ByteVector, txIds: List[String]) = { strict checkCaller = i.onlyFactory() - func addNewAction(state: List[Any], txId: ByteVector) = { + func addNewAction(state: List[Any], txId: String) = { let ( userAddress, lpAssetAmount, @@ -587,17 +597,17 @@ func claimCollateralBulk(userAddressBytes: ByteVector, txIds: List[ByteVector]) wavesAmount, assetsString, amountsString - ) = claimCollateralINTERNAL(userAddressBytes, txId, i.transactionId) + ) = claimCollateralINTERNAL(userAddressBytes, txId.fromBase58String()) let assetsList = assetsString.split_51C(SEP).removeByIndex(0) let amountsList = amountsString.split_51C(SEP).removeByIndex(0) let newActions = [ factoryAddressOrFail.invoke("deleteEntry", [ - keyWithdrawalRequest(userAddress, txId) + keyWithdrawalRequest(userAddress, txId.fromBase58String()) ], []), factoryAddressOrFail.invoke("integerEntry", [ - keyWithdrawalHistory(userAddress, txId), + keyWithdrawalHistory(userAddress, txId.fromBase58String()), lpAssetAmount ], []), factoryAddressOrFail.invoke("transferAssets", [userAddressBytes, assetsList, amountsList], []) @@ -612,16 +622,16 @@ func claimCollateralBulk(userAddressBytes: ByteVector, txIds: List[ByteVector]) } @Callable(i) -func claimCollateralREADONLY(userAddressBytes: ByteVector, txId: ByteVector) = { - let response = claimCollateralREADONLYStringResponse(userAddressBytes, txId, i.transactionId) +func claimCollateralREADONLY(userAddressBytes: ByteVector, txId: String) = { + let response = claimCollateralREADONLYStringResponse(userAddressBytes, txId.fromBase58String()) (nil, response) } @Callable(i) -func claimCollateralBulkREADONLY(userAddressBytes: ByteVector, txIds: List[ByteVector]) = { - func processTxId(state: List[String], txId: ByteVector) = { - let response = claimCollateralREADONLYStringResponse(userAddressBytes, txId, i.transactionId) +func claimCollateralBulkREADONLY(userAddressBytes: ByteVector, txIds: List[String]) = { + func processTxId(state: List[String], txId: String) = { + let response = claimCollateralREADONLYStringResponse(userAddressBytes, txId.fromBase58String()) state :+ response } diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index 536dce1..d6da032 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -19,6 +19,7 @@ const proxyTreasuryPath = format({ dir: 'contracts/treasury', base: 'proxy_treas const scale8 = 1e8 export const setup = async ({ + investPeriodLength = 9999999, periodLength = 2, blockProcessingReward = 500000, nextBlockToProcess = 2, @@ -104,6 +105,7 @@ export const setup = async ({ { key: `%s%d__startHeight__${period}`, type: 'integer', value: nextBlockToProcess }, { key: `%s%d__price__${period}`, type: 'integer', value: price }, { key: '%s__periodLength', type: 'integer', value: periodLength }, + { key: '%s__investPeriodLength', type: 'integer', value: investPeriodLength }, { key: '%s__blockProcessingReward', type: 'integer', value: blockProcessingReward }, { key: '%s%s__invested__WAVES', type: 'integer', value: investedWavesAmount }, { key: '%s%s__donated__WAVES', type: 'integer', value: donatedWavesAmount } diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index 33ecf9e..1000cb0 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -1,19 +1,24 @@ ### Required state entries -| key | type | description | -| :---------------------------- | :------- | :---------------------------- | -| `%s__calculator` | `String` | Calculator Address | -| `%s__proxyTreasury` | `String` | Proxy Treasury Address | -| `%s__mainTreasury` | `String` | Main Treasury Address | -| `%s__config` | `String` | DAO Config address | -| `%s__lpAssetId` | `String` | LP Asset ID | -| `%s__currentPeriod` | `Int` | Current period num | -| `%s__periodLength` | `Int` | Period length in blocks | -| `%s%s__invested__WAVES` | `Int` | Invested Amount in Waves | -| `%s%s__donated__WAVES` | `Int` | Donated Amount in Waves | -| `%s%d__startHeight__` | `Int` | Starting Height of `` | -| `%s%d__price__` | `Int` | LP Asset Price for `` | -| `%s__nextBlockToProcess` | `Int` | Next block height to process | +| key | type | description | +| :------------------------------------ | :------- | :------------------------------- | +| `%s__calculator` | `String` | Calculator Address | +| `%s__proxyTreasury` | `String` | Proxy Treasury Address | +| `%s__mainTreasury` | `String` | Main Treasury Address | +| `%s__businessTreasury` | `String` | Business Treasury Address | +| `%s__config` | `String` | DAO Config address | +| `%s__lpAssetId` | `String` | LP Asset ID | +| `%s__currentPeriod` | `Int` | Current period num | +| `%s__periodLength` | `Int` | Period length in blocks | +| `%s__investPeriodLength` | `Int` | Invest Period length in blocks | +| `%s%s__invested__WAVES` | `Int` | Invested Amount in Waves | +| `%s%s__donated__WAVES` | `Int` | Donated Amount in Waves | +| `%s%d__startHeight__` | `Int` | Starting Height of `` | +| `%s%d__price__` | `Int` | LP Asset Price for `` | +| `%s__nextBlockToProcess` | `Int` | Next block height to process | +| `%s%d__periodReward__` | `Int` | Period reward assetIds list | +| `%s%d__periodRewardAmount__` | `Int` | Period reward assets amount list | + ### User state @@ -69,13 +74,33 @@ Cancel withdraw request. func cancelWithdraw(txIdStr: String) ``` -#### Claim Waves +#### Claim Collateral -Claim Waves from withdraw request at current price. +Claim Collateral from withdraw request at current price. `txIdStr` - withdraw request TxId ``` -func claimWaves(txIdStr: String) +func claimCollateral(txIdStr: String) +``` + +Claim Collateral from butch withdraw requests at current price. +`txIds` - withdraw requests list +``` +func claimCollateralBulk(txIds: List[String]) +``` + +Claim Collateral from withdraw request at current price. +`userAddress` - user address for claim check +`txIdStr` - withdraw request TxId +``` +func claimCollateralREADONLY(userAddress: String, txIdStr: String) +``` + +Claim Collateral from butch withdraw requests at current price. +`userAddress` - user address for claim check +`txIds` - withdraw requests list +``` +claimCollateralBulkREADONLY(userAddress: String, txIds: List[String]) ``` --- diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index da85928..1d7ac12 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -310,7 +310,11 @@ func claimLP() = @Callable(i) func claimCollateral(txIdStr: String) = - (nil, calculatorAddressOrFail.reentrantInvoke("claimCollateral", [i.caller.bytes, txIdStr.fromBase58String()], i.payments)) + (nil, calculatorAddressOrFail.reentrantInvoke("claimCollateral", [i.caller.bytes, txIdStr], i.payments)) + +@Callable(i) +func claimCollateralBulk(txIds: List[String]) = + (nil, calculatorAddressOrFail.reentrantInvoke("claimCollateralBulk", [i.caller.bytes, txIds], i.payments)) @Callable(i) func invest() = @@ -332,7 +336,15 @@ func processBlocks() = (nil, calculatorAddressOrFail.reentrantInvoke("processBlo func claimCollateralREADONLY(userAddress: String, txIdStr: String) = { (nil, calculatorAddressOrFail.reentrantInvoke( "claimCollateralREADONLY", - [userAddress.fromBase58String(), txIdStr.fromBase58String()], [] + [userAddress.fromBase58String(), txIdStr], [] + )) +} + +@Callable(i) +func claimCollateralBulkREADONLY(userAddress: String, txIds: List[String]) = { + (nil, calculatorAddressOrFail.reentrantInvoke( + "claimCollateralBulkREADONLY", + [userAddress.fromBase58String(), txIds], [] )) } From 61614dcbc9b25ec90ca97b7a8c2da9427e565744 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Thu, 17 Aug 2023 15:41:10 +0300 Subject: [PATCH 130/143] Refactored finalize calculations --- contracts/calculator/calculator.ride | 47 +++++++++++++++------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 3621338..30ff164 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -158,25 +158,17 @@ func rewardForOption(rewards: List[(Address, Int)], target: Address) = { else unit } -func finalizeINTERNAL( - donationPartInWaves: Int, - lpPartInWaves: Int, - claimPartInWaves: Int, - powerStakePartInWaves: Int -) = { +func calculatePrice(lpPartInWaves: Int) = { # calculate new price let lpAssetAmountToBurn = factoryAddressOrFail.getInteger(keyWithdrawal()).valueOrElse(0) let lpAssetQuantity = lpAssetIdOrFail.assetInfo() .valueOrErrorMessage(wrapErr("invalid lpAsset info")).quantity let newPrice = fraction(lpPartInWaves, SCALE8, lpAssetQuantity - lpAssetAmountToBurn) - strict checkIfPriceNotZero = (newPrice != 0) || throwErr("LP price cannot be 0") + strict checkIfPriceNotZero = (newPrice != 0) || throwErr("LP price cannot be 0") let lpAssetFinalQuantity = lpAssetQuantity - lpAssetAmountToBurn ( - claimPartInWaves, - lpPartInWaves, - donationPartInWaves, newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity @@ -290,15 +282,12 @@ func finalize( powerStakePartInWaves >= 0 || throwErr("invalid PWR stake part") ] - # Finalize calculations + # Price calculations let ( - paymentAmountMin, - finalInvestedWavesAmount, - donatedWavesAmountNew, - newPrice, - lpAssetAmountToBurn, + newPrice, + lpAssetAmountToBurn, lpAssetFinalQuantity - ) = finalizeINTERNAL(donationPartInWaves, lpPartInWaves, claimPartInWaves, powerStakePartInWaves) + ) = calculatePrice(lpPartInWaves) let newPeriod = currentPeriodOrFail + 1 @@ -334,9 +323,9 @@ func finalize( factoryAddressOrFail.invoke("burn", [lpAssetAmountToBurn], []), factoryAddressOrFail.invoke("integerEntry", [keyWithdrawal(), 0], []), # new invested amount - factoryAddressOrFail.invoke("integerEntry", [keyInvested(unit), finalInvestedWavesAmount], []), + factoryAddressOrFail.invoke("integerEntry", [keyInvested(unit), lpPartInWaves], []), # new donated amount - factoryAddressOrFail.invoke("integerEntry", [keyDonated(unit), donatedWavesAmountNew], []), + factoryAddressOrFail.invoke("integerEntry", [keyDonated(unit), donationPartInWaves], []), # new period treasury factoryAddressOrFail.invoke("stringEntry", [keyPeriodWithdrawalAssetIds(newPeriod), AssetIds], []), factoryAddressOrFail.invoke("stringEntry", [keyPeriodWithdrawalAmounts(newPeriod), Amounts], []) @@ -387,8 +376,24 @@ func finalizeREADONLY( powerStakePartInWaves >= 0 || throwErr("invalid PWR stake part") ] - # Finalize calculations - ([], finalizeINTERNAL(donationPartInWaves, lpPartInWaves, claimPartInWaves, powerStakePartInWaves)) + # Price calculations + let ( + newPrice, + lpAssetAmountToBurn, + lpAssetFinalQuantity + ) = calculatePrice(lpPartInWaves) + + ( + [], + ( + claimPartInWaves, + lpPartInWaves, + donationPartInWaves, + newPrice, + lpAssetAmountToBurn, + lpAssetFinalQuantity + ) + ) } # payment in waves From 3c0b295c6478efbbae27d00b506b71d7e55ad947 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Fri, 18 Aug 2023 10:54:11 +0300 Subject: [PATCH 131/143] Fixed error with power swap and stake Changed attached payment --- contracts/calculator/calculator.ride | 12 ++++++++---- contracts/factory/factory.ride | 14 ++++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index f501afd..8a339cc 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -735,8 +735,10 @@ func processBlocks(userAddressBytes: ByteVector) = { # Swap share amount to power token strict totalPowerAmount = factoryAddressOrFail.invoke("swap", - [powerAssetIdStringOrFail], - [AttachedPayment(unit, amountToPowerTotal)]) + [powerAssetIdStringOrFail, + WAVES, + amountToPowerTotal], + []) let totalPowerAmountInt = match(totalPowerAmount) { case pAmount:Int => pAmount @@ -749,8 +751,10 @@ func processBlocks(userAddressBytes: ByteVector) = { let powerAmount = fraction(shareAmount, totalPowerAmountInt, amountToPowerTotal) strict inv = factoryAddressOrFail.invoke( "powerStake", - [generator.fromBase58String()], - [AttachedPayment(powerAssetIdStringOrFail.fromBase58String(), powerAmount)]) + [generator.fromBase58String(), + powerAssetIdStringOrFail.fromBase58String(), + powerAmount], + []) nil } else { nil } } diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index c4747a1..384c6e9 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -367,14 +367,18 @@ func claimCollateralBulkREADONLY(userAddress: String, txIds: List[String]) = { } @Callable(i) -func swap(assetId: String) = { +func swap(assetId: String, paymentAssetId: String, paymentAmount: Int) = { strict check = [ i.onlyCalculator() ] + let paymentAsset = if (paymentAssetId == "WAVES") then unit else paymentAssetId.fromBase58String() strict initAssetBalance = if (assetId == "WAVES") then this.wavesBalance().available else this.assetBalance(assetId.fromBase58String()) - strict swapInvoke = swapContractAddressOrFail.invoke("swap", [0, assetId, this.toString()], i.payments) + strict swapInvoke = swapContractAddressOrFail.invoke( + "swap", + [0, assetId, this.toString()], + [AttachedPayment(paymentAsset, paymentAmount)]) strict newAssetBalance = if (assetId == "WAVES") then this.wavesBalance().available @@ -384,9 +388,11 @@ func swap(assetId: String) = { } @Callable(i) -func powerStake(recipientBytes: ByteVector) = +func powerStake(recipientBytes: ByteVector, assetIdBytes: ByteVector, amount: Int) = if (i.onlyCalculator()) - then (nil, powerContractAddressOrFail.invoke("commitForMiner", [Address(recipientBytes).toString()], i.payments)) + then (nil, powerContractAddressOrFail.invoke("commitForMiner", + [Address(recipientBytes).toString()], + [AttachedPayment(assetIdBytes, amount)])) else ([], unit) ###################### From 21ac628f6245e3daaa5a0f58bfe3112ec48ccd79 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Fri, 18 Aug 2023 12:51:52 +0300 Subject: [PATCH 132/143] Changed reward split steps Added split evaluation Fixed tests Updated spec --- contracts/calculator/calculator.ride | 81 ++++++++++++++++--- contracts/calculator/test/power_share.spec.js | 2 +- ...cess_blocks_with_business_treasury.spec.js | 7 +- contracts/factory/factory.md | 17 ++++ contracts/factory/factory.ride | 10 +++ migrations/2023_08_18_factory_data_tx.json | 44 ++++++++++ 6 files changed, 145 insertions(+), 16 deletions(-) create mode 100644 migrations/2023_08_18_factory_data_tx.json diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 8a339cc..a892cf0 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -236,6 +236,57 @@ func claimCollateralREADONLYStringResponse(userAddressBytes: ByteVector, txId: B ].makeString(SEP) } +func getRewardSplit(generatorRewardAmount: Int) = { + # Share Ratio cannot be more that 1.0 or less than 0.0 + let powerShareRatio = max([0, min([factoryAddressOrFail.getInteger(keyPowerShareRatio()).valueOrElse(0), SCALE8])]) + let businessPartRatio = max([0, min([factoryAddressOrFail.getInteger(keyBusinessTreasuryPart()).valueOrElse(0), SCALE8])]) + + let amountToPowerPart = fraction(generatorRewardAmount, powerShareRatio, SCALE8) + let businessTreasuryAmountPart = fraction(generatorRewardAmount, businessPartRatio, SCALE8) + + let rewardRemainder = generatorRewardAmount - amountToPowerPart - businessTreasuryAmountPart + + if (rewardRemainder > 0) then + (amountToPowerPart, businessTreasuryAmountPart, rewardRemainder) + else + throwErr("amount to main treasury cannot be negative") +} + +func calcRewardSplitForAmount(amount: Int) = { + let blocksProcessingBatchSizeMax = 20 + let (amountToPowerPart, businessTreasuryAmountPart, rewardRemainder) = getRewardSplit(amount) + let blockProcessingReward = factoryAddressOrFail + .getInteger(keyBlockProcessingReward()) + .valueOrErrorMessage(wrapErr("invalid block processing reward")) + let blockProcessingRewardByGenerator = blockProcessingReward / blocksProcessingBatchSizeMax + + let toLpAmount = rewardRemainder - blockProcessingReward + + ( + amountToPowerPart, + businessTreasuryAmountPart, + blockProcessingReward, + toLpAmount, + amount + ) +} + +# return: +# _1 = amountToPowerPart +# _2 = businessTreasuryAmountPart +# _3 = blockProcessingReward +# _4 = toLpAmount +# _5 = totalAmount +@Callable(i) +func rewardSplitREADONLY() = { + let targetBlockHeight = height - 1 + let targetBlockInfo = blockInfoByHeight(targetBlockHeight).valueOrErrorMessage(wrapErr("invalid block info")) + let treasuryRewardOrFail = rewardForOption(targetBlockInfo.rewards, proxyTreasuryAddressOrFail) + .valueOrErrorMessage(wrapErr("invalid treasury reward for height " + targetBlockHeight.toString())) + + ([], calcRewardSplitForAmount(treasuryRewardOrFail)) +} + @Callable(i) func claimLP(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() @@ -658,7 +709,7 @@ func processBlocks(userAddressBytes: ByteVector) = { let blockProcessingRewardByGenerator = blockProcessingReward / blocksProcessingBatchSize let blockProcessingRewardByGeneratorRemainder = blockProcessingReward - blockProcessingRewardByGenerator * blocksProcessingBatchSize - func map(acc: (Int, Int, (Int, List[(String, Int)])), inc: Int) = { + func map(acc: (Int, Int, Int, (Int, List[(String, Int)])), inc: Int) = { if (inc >= blocksProcessingBatchSize) then { acc } else { @@ -675,12 +726,10 @@ func processBlocks(userAddressBytes: ByteVector) = { blockProcessingRewardByGenerator } - # Power Share Ratio cannot be more that 1.0 or less than 0.0 - let powerShareRatio = max([0, min([factoryAddressOrFail.getInteger(keyPowerShareRatio()).valueOrElse(0), SCALE8])]) - let shareAmountToPower = fraction((treasuryRewardOrFail - callerReward), powerShareRatio, SCALE8) - + let (shareAmountToPower, businessTreasuryAmountPart, rewardRemainder) = getRewardSplit(treasuryRewardOrFail) + let lpAssetAmount = if (currentPriceOrFail > 0) - then fraction(treasuryRewardOrFail - callerReward - shareAmountToPower, SCALE8, currentPriceOrFail) + then fraction(rewardRemainder - callerReward, SCALE8, currentPriceOrFail) else 0 strict factoryActionsSingle = [ @@ -703,11 +752,16 @@ func processBlocks(userAddressBytes: ByteVector) = { ], []) ] - let (lpAssetAcc, rewardAcc, powerShareDataTuple) = acc + let (lpAssetAcc, rewardAcc, businessTreasuryAcc, powerShareDataTuple) = acc let (powerShareAcc, generatorPowerShareList) = powerShareDataTuple let newGeneratorPowerShareList = generatorPowerShareList :+ (generator.toString(), shareAmountToPower) - (lpAssetAcc + lpAssetAmount, rewardAcc + treasuryRewardOrFail, (powerShareAcc + shareAmountToPower, newGeneratorPowerShareList)) + ( + lpAssetAcc + lpAssetAmount, + rewardAcc + treasuryRewardOrFail, + businessTreasuryAcc + businessTreasuryAmountPart, + (powerShareAcc + shareAmountToPower, newGeneratorPowerShareList) + ) } } @@ -715,12 +769,15 @@ func processBlocks(userAddressBytes: ByteVector) = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ] - strict (lpAssetAmountTotal, rewardAmountTotal, powerShareDataTuple) = FOLD<20>(list, (0, 0, (0, [])), map) + strict ( + lpAssetAmountTotal, + rewardAmountTotal, + rewardToBusinessTreasuryAmount, + powerShareDataTuple + ) = FOLD<20>(list, (0, 0, 0, (0, [])), map) let (amountToPowerTotal, powerShareAmountsList) = powerShareDataTuple - let businessTreasuryPart = factoryAddressOrFail.getInteger(keyBusinessTreasuryPart()).valueOrElse(0) - let rewardToBusinessTreasuryAmount = fraction(rewardAmountTotal, businessTreasuryPart, SCALE8) - + let rewardToMainTreasuryAmount = rewardAmountTotal - rewardToBusinessTreasuryAmount - blockProcessingReward - amountToPowerTotal let invested = factoryAddressOrFail.getInteger(keyInvested(unit)).valueOrElse(0) diff --git a/contracts/calculator/test/power_share.spec.js b/contracts/calculator/test/power_share.spec.js index a1e1493..e44c92e 100644 --- a/contracts/calculator/test/power_share.spec.js +++ b/contracts/calculator/test/power_share.spec.js @@ -31,7 +31,7 @@ describe(`[${process.pid}] calculator: process blocks`, () => { const blockReward = 2e8 const powerPrice = 0.5 // Set in mock contract const blocksCount = Math.min(periodLength, maxProcessBlocks) - const sharedPartInWaves = Math.floor((blockReward * blocksCount - blockProcessingReward) * powerShareRatio) + const sharedPartInWaves = Math.floor(blockReward * blocksCount * powerShareRatio) const sharedPartInPower = Math.floor(sharedPartInWaves * powerPrice) const setupBalance = 100e8 // Waves amount from setup diff --git a/contracts/calculator/test/process_blocks_with_business_treasury.spec.js b/contracts/calculator/test/process_blocks_with_business_treasury.spec.js index 4550564..9fe8a39 100644 --- a/contracts/calculator/test/process_blocks_with_business_treasury.spec.js +++ b/contracts/calculator/test/process_blocks_with_business_treasury.spec.js @@ -14,7 +14,7 @@ import wc from '@waves/ts-lib-crypto' chai.use(chaiAsPromised) const { expect } = chai -describe(`[${process.pid}] calculator: process blocks2`, () => { +describe(`[${process.pid}] calculator: process blocks`, () => { let accounts, lpAssetId, periodLength, blockProcessingReward const businessTreasuryPartValue = 1e8 / 20 @@ -77,15 +77,16 @@ describe(`[${process.pid}] calculator: process blocks2`, () => { lpAssetId ) const daoBlockReward = 2e8 + const businessTreasuryPart = businessTreasuryPartValue / 1e8 + const businessTreasurePartAmount = daoBlockReward * businessTreasuryPart * periodLength const expectedBalance = - daoBlockReward * periodLength - blockProcessingReward + daoBlockReward * periodLength - blockProcessingReward - businessTreasurePartAmount expect(balance).to.equal(expectedBalance) const { balance: featureTreasuryBalance } = await api.addresses.fetchBalance(accounts.mainTreasury.address) const blockReward = 2e8 const setupBalance = 100e8 // Waves amount from setup - const businessTreasuryPart = businessTreasuryPartValue / 1e8 const featureTreasuryPart = 1 - businessTreasuryPart const expectedFeatureTreasuryBalance = blockReward * periodLength * featureTreasuryPart - diff --git a/contracts/factory/factory.md b/contracts/factory/factory.md index 2dcea9d..a7c6792 100644 --- a/contracts/factory/factory.md +++ b/contracts/factory/factory.md @@ -22,6 +22,7 @@ | `%s%d__periodReward__` | `Int` | Period reward assetIds list | | `%s%d__periodRewardAmount__` | `Int` | Period reward assets amount list | | `%s__powerShareRatio` | `Int` | Power share ratio | +| `%s__businessTreasuryPart` | `Int` | Business treasury Part | ### User state @@ -122,6 +123,22 @@ func processBlocks() --- +### Reward split evaluation +Evaluate reward split for last block +Return values: +- _1 = `amountToPowerPart` +- _2 = `businessTreasuryAmountPart` +- _3 = `blockProcessingReward` +- _4 = `toLpAmount` +- _5 = `totalAmount` + +``` +@Callable(i) +func rewardSplitREADONLY() +``` + +--- + ### Finalize evaluation Evaluate finalization results and required Waves amount to finish finalization. Arguments: diff --git a/contracts/factory/factory.ride b/contracts/factory/factory.ride index 384c6e9..b6f26a1 100644 --- a/contracts/factory/factory.ride +++ b/contracts/factory/factory.ride @@ -322,6 +322,16 @@ func finalizeREADONLY( ) } +# return: +# _1 = amountToPowerPart +# _2 = businessTreasuryAmountPart +# _3 = blockProcessingReward +# _4 = toLpAmount +# _5 = totalAmount +@Callable(i) +func rewardSplitREADONLY() = +(nil, calculatorAddressOrFail.reentrantInvoke("rewardSplitREADONLY", [], [])) + @Callable(i) func claimLP() = (nil, calculatorAddressOrFail.reentrantInvoke("claimLP", [i.caller.bytes], i.payments)) diff --git a/migrations/2023_08_18_factory_data_tx.json b/migrations/2023_08_18_factory_data_tx.json new file mode 100644 index 0000000..1b635b2 --- /dev/null +++ b/migrations/2023_08_18_factory_data_tx.json @@ -0,0 +1,44 @@ +{ + "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", + "data": [ + { + "key": "%s__businessTreasury", + "type": "string", + "value": "" + }, + { + "key": "%s__powerContract", + "type": "string", + "value": "3P3w8TSPSRDVMLAzJcTeHnKAQsPnQgArUKy" + }, + { + "key": "%s__swapContract", + "type": "string", + "value": "3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93" + }, + { + "key": "%s__powerAssetId", + "type": "string", + "value": "2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" + }, + { + "key": "%s__powerShareRatio", + "type": "integer", + "value": 2000000 // 2% ??? + }, + { + "key": "%s__businessTreasuryPart", + "type": "integer", + "value": ??? + }, + { + "key": "%s__investPeriodLength", + "type": "integer", + "value": ??? + } + ], + "proofs": [], + "fee": 500000, + "type": 12, + "version": 2 +} \ No newline at end of file From 3be0a8c44348f6d5ec31dca3f8b3fbaf17b31724 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Fri, 18 Aug 2023 16:14:33 +0300 Subject: [PATCH 133/143] data tx --- migrations/2023_08_18_factory_data_tx.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/migrations/2023_08_18_factory_data_tx.json b/migrations/2023_08_18_factory_data_tx.json index 1b635b2..9cb2160 100644 --- a/migrations/2023_08_18_factory_data_tx.json +++ b/migrations/2023_08_18_factory_data_tx.json @@ -4,7 +4,7 @@ { "key": "%s__businessTreasury", "type": "string", - "value": "" + "value": "3PMQvtkPVFNLtyHFNh33Aarvso6yppgUUft" }, { "key": "%s__powerContract", @@ -24,21 +24,21 @@ { "key": "%s__powerShareRatio", "type": "integer", - "value": 2000000 // 2% ??? + "value": 5000000 }, { "key": "%s__businessTreasuryPart", "type": "integer", - "value": ??? + "value": 0 }, { "key": "%s__investPeriodLength", "type": "integer", - "value": ??? + "value": 43200 } ], "proofs": [], "fee": 500000, "type": 12, "version": 2 -} \ No newline at end of file +} From bec95844f6aea2bd5b77c0353e162a222f3d3133 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 22 Aug 2023 15:56:38 +0300 Subject: [PATCH 134/143] Withdraw restrictions Disabled cancelWithdraw Added height check in withdraw Updated tests --- contracts/calculator/calculator.ride | 43 ++++++------------- .../calculator/test/cancel_withdraw.spec.js | 17 ++++---- contracts/calculator/test/withdraw.spec.js | 6 ++- .../test/withdraw_period_exceeded.spec.js | 39 +++++++++++++++++ 4 files changed, 64 insertions(+), 41 deletions(-) create mode 100644 contracts/calculator/test/withdraw_period_exceeded.spec.js diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index a892cf0..af45241 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -519,10 +519,21 @@ func invest(userAddressBytes: ByteVector) = { @Callable(i) func withdraw(userAddressBytes: ByteVector) = { strict checkCaller = i.onlyFactory() + let userAddress = Address(userAddressBytes) let currentPeriodOrFail = factoryAddressOrFail.getInteger(keyCurrentPeriod()) .valueOrErrorMessage(wrapErr("invalid period")) + let periodLength = + factoryAddressOrFail.getInteger(keyPeriodLength()) + .valueOrErrorMessage(wrapErr("invalid period length")) + let currentStartHeight = factoryAddressOrFail + .getInteger(keyStartHeight(currentPeriodOrFail)) + .valueOrErrorMessage(wrapErr("invalid start height")) + + strict heightCheck = + height < currentStartHeight + periodLength || throwErr("too late to withdraw in this period") + let payment = if (i.payments.size() == 1) then i.payments[0] else throwErr(wrapErr("invalid payments")) let paymentAssetId = if (payment.assetId == lpAssetIdOrFail) then lpAssetIdOrFail else throwErr("invalid payment asset") let paymentAmount = if (payment.amount > 0) then payment.amount else throwErr("invalid payment amount") @@ -550,37 +561,7 @@ func withdraw(userAddressBytes: ByteVector) = { @Callable(i) func cancelWithdraw(userAddressBytes: ByteVector, txId: ByteVector) = { strict checkCaller = i.onlyFactory() - let userAddress = Address(userAddressBytes) - let withdrawalRequestOption = factoryAddressOrFail - .getString(keyWithdrawalRequest(userAddress, txId)) - .valueOrErrorMessage(wrapErr("invalid withdrawal request")) - let currentPeriodOrFail = - factoryAddressOrFail.getInteger(keyCurrentPeriod()) - .valueOrErrorMessage(wrapErr("invalid period")) - let (status, lpAssetAmount, targetPeriod, claimTxId) = parseWithdrawalRequestValueOrFail(withdrawalRequestOption) - strict checks = [ - status == PENDING || throwErr("invalid withdrawal request status"), - targetPeriod > currentPeriodOrFail || throwErr("invalid withdrawal request period") - ] - - let withdrawal = factoryAddressOrFail.getInteger(keyWithdrawal()) - .valueOrErrorMessage(wrapErr("invalid total withdrawal amount")) - strict factoryActions = [ - # decrease total withdrawal amount - factoryAddressOrFail.invoke("integerEntry", [ - keyWithdrawal(), - if (withdrawal >= lpAssetAmount) - then withdrawal - lpAssetAmount - else throwErr("invalid withdrawal amount") - ], []), - factoryAddressOrFail.invoke("deleteEntry", [ - keyWithdrawalRequest(userAddress, txId) - ], []), - factoryAddressOrFail.invoke("transferAsset", [ - userAddressBytes, lpAssetAmount, lpAssetIdOrFail - ], []) - ] - (nil, factoryActions) + throwErr("cancelWithdraw is deprecated") } @Callable(i) diff --git a/contracts/calculator/test/cancel_withdraw.spec.js b/contracts/calculator/test/cancel_withdraw.spec.js index f128cf0..1452236 100644 --- a/contracts/calculator/test/cancel_withdraw.spec.js +++ b/contracts/calculator/test/cancel_withdraw.spec.js @@ -11,7 +11,11 @@ describe(`[${process.pid}] calculator: cancel withdraw`, () => { let accounts, lpAssetId, withdrawTxId before(async () => { - ({ accounts, lpAssetId } = await setup()) + const { height } = await api.blocks.fetchHeight(); + ({ accounts, lpAssetId } = await setup({ + nextBlockToProcess: height, + periodLength: 10 + })) const paymentAmount = 1e8 await broadcastAndWait(invokeScript({ @@ -29,20 +33,15 @@ describe(`[${process.pid}] calculator: cancel withdraw`, () => { }, accounts.user1.seed))) }) - it('total withdrawal amount should be decreased', async () => { - const { balance: userBalanceBefore } = await api.assets.fetchBalanceAddressAssetId(accounts.user1.address, lpAssetId) + it('cancel withdraw should be rejected as deprecated', async () => { const paymentAmount = 1e8 const { value: totalWithdrawalAmountBefore } = await api.addresses.fetchDataKey(accounts.factory.address, '%s__withdrawal') expect(totalWithdrawalAmountBefore).to.equal(paymentAmount) - await broadcastAndWait(invokeScript({ + const tx = broadcastAndWait(invokeScript({ dApp: accounts.factory.address, call: { function: 'cancelWithdraw', args: [{ type: 'string', value: withdrawTxId }] }, chainId }, accounts.user1.seed)) - const { balance: userBalanceAfter } = await api.assets.fetchBalanceAddressAssetId(accounts.user1.address, lpAssetId) - const { value: totalWithdrawalAmountAfter } = await api.addresses.fetchDataKey(accounts.factory.address, '%s__withdrawal') - expect(totalWithdrawalAmountAfter, 'invalid total withdrawal amount').to.equal(0) - const expectedUserBalance = userBalanceBefore + paymentAmount - expect(userBalanceAfter, 'invalid user balance').to.equal(expectedUserBalance) + return expect(tx).to.be.rejectedWith('cancelWithdraw is deprecated') }) }) diff --git a/contracts/calculator/test/withdraw.spec.js b/contracts/calculator/test/withdraw.spec.js index 2f62bce..4dd79f9 100644 --- a/contracts/calculator/test/withdraw.spec.js +++ b/contracts/calculator/test/withdraw.spec.js @@ -11,7 +11,11 @@ describe(`[${process.pid}] calculator: withdraw`, () => { let accounts, lpAssetId before(async () => { - ({ accounts, lpAssetId } = await setup()) + const { height } = await api.blocks.fetchHeight(); + ({ accounts, lpAssetId } = await setup({ + nextBlockToProcess: height, + periodLength: 10 + })) const paymentAmount = 1e8 await broadcastAndWait(invokeScript({ diff --git a/contracts/calculator/test/withdraw_period_exceeded.spec.js b/contracts/calculator/test/withdraw_period_exceeded.spec.js new file mode 100644 index 0000000..4fb5e25 --- /dev/null +++ b/contracts/calculator/test/withdraw_period_exceeded.spec.js @@ -0,0 +1,39 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { api, chainId, broadcastAndWait } from '../../../utils/api.js' +import { setup } from './_setup.js' +import { invokeScript } from '@waves/waves-transactions' + +chai.use(chaiAsPromised) +const { expect } = chai + +describe(`[${process.pid}] calculator: withdraw`, () => { + let accounts, lpAssetId + + before(async () => { + const { height } = await api.blocks.fetchHeight(); + ({ accounts, lpAssetId } = await setup({ + nextBlockToProcess: height - 10, + periodLength: 1 + })) + + const paymentAmount = 1e8 + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'invest', args: [] }, + payment: [{ assetId: null, amount: paymentAmount }], + chainId + }, accounts.user1.seed)) + }) + + it('withdraw should be disabled if period is over', async () => { + const paymentAmount = 1e8 + const tx = broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'withdraw', args: [] }, + payment: [{ assetId: lpAssetId, amount: paymentAmount }], + chainId + }, accounts.user1.seed)) + return expect(tx).to.be.rejectedWith('too late to withdraw in this period') + }) +}) From a3898d9a0e57621025ad0ac33e09982179ecc022 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 22 Aug 2023 16:38:19 +0300 Subject: [PATCH 135/143] Reduced processing blocks batch size Update tests --- contracts/calculator/calculator.ride | 3 +- .../calculator/test/claim_collateral.spec.js | 32 +++++++++++-------- .../test/claim_collateral_readonly.spec.js | 31 +++++++++++------- contracts/calculator/test/power_share.spec.js | 2 +- 4 files changed, 40 insertions(+), 28 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index af45241..b03d0b2 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -7,6 +7,7 @@ let CONTRACT_NAME = "calculator.ride" let SCALE8 = 100_000_000 let PENDING = "PENDING" let WAVES = "WAVES" +let blocksProcessingBatchSizeMax = 10 func wrapErr(s: String) = { CONTRACT_NAME + ": " + s @@ -253,7 +254,6 @@ func getRewardSplit(generatorRewardAmount: Int) = { } func calcRewardSplitForAmount(amount: Int) = { - let blocksProcessingBatchSizeMax = 20 let (amountToPowerPart, businessTreasuryAmountPart, rewardRemainder) = getRewardSplit(amount) let blockProcessingReward = factoryAddressOrFail .getInteger(keyBlockProcessingReward()) @@ -671,7 +671,6 @@ func processBlocks(userAddressBytes: ByteVector) = { .valueOrErrorMessage(wrapErr("invalid next block to process")) let periodEndHeight = currentStartHeight + periodLength - 1 - let blocksProcessingBatchSizeMax = 20 # do not process blocks not in current period let blocksProcessingBatchSize = if ( diff --git a/contracts/calculator/test/claim_collateral.spec.js b/contracts/calculator/test/claim_collateral.spec.js index a8b80e9..02f0f0b 100644 --- a/contracts/calculator/test/claim_collateral.spec.js +++ b/contracts/calculator/test/claim_collateral.spec.js @@ -1,6 +1,6 @@ import chai from 'chai' import chaiAsPromised from 'chai-as-promised' -import { api, chainId, broadcastAndWait, baseSeed } from '../../../utils/api.js' +import { api, chainId, broadcastAndWait, baseSeed, waitForHeight } from '../../../utils/api.js' import { setup } from './_setup.js' import { invokeScript, transfer, issue } from '@waves/waves-transactions' @@ -8,9 +8,11 @@ chai.use(chaiAsPromised) const { expect } = chai const scale8 = 1e8 +const periodLen = 5 +const paymentAmount = 1e8 describe(`[${process.pid}] calculator: claim collateral`, () => { - let accounts, lpAssetId, investedWavesAmount + let accounts, lpAssetId, investedWavesAmount, startHeight before(async () => { const { height } = await api.blocks.fetchHeight() @@ -18,17 +20,13 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { ({ accounts, lpAssetId } = await setup({ investedWavesAmount, nextBlockToProcess: height, - periodLength: 1 + periodLength: periodLen })) - await broadcastAndWait(invokeScript({ - dApp: accounts.factory.address, - call: { function: 'processBlocks', args: [] }, - chainId - }, accounts.user1.seed)) + startHeight = height - const paymentAmount = 1e8 investedWavesAmount += paymentAmount + await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, call: { function: 'invest', args: [] }, @@ -38,8 +36,6 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { }) it('user should successfully claim assets after finalization', async () => { - const paymentAmount = 1e8 - const { id: firstAssetId } = await broadcastAndWait( issue( { @@ -114,7 +110,17 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { const newLpInWaves = 1000 * 1e8 const claimAmountInWaves = 100 * 1e8 const pwrManagersBonusInWaves = 100 * 1e8 + + await waitForHeight(startHeight + periodLen + 1) + + await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { function: 'processBlocks', args: [] }, + chainId + }, accounts.user1.seed)) + const [{ quantity }] = await api.assets.fetchDetails([lpAssetId]) + await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, call: { @@ -150,8 +156,8 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') const expectedPrice = Math.floor(newLpInWaves * scale8 / (quantity - paymentAmount)) - expect(price).to.equal(expectedPrice) - expect(stateChangesTransfers).to.deep.equal([ + expect(price, 'wrong price').to.equal(expectedPrice) + expect(stateChangesTransfers, 'wrong collateral transfers').to.deep.equal([ { address: accounts.user1.address, asset: firstAssetId, diff --git a/contracts/calculator/test/claim_collateral_readonly.spec.js b/contracts/calculator/test/claim_collateral_readonly.spec.js index e88c7ff..86ceeb8 100644 --- a/contracts/calculator/test/claim_collateral_readonly.spec.js +++ b/contracts/calculator/test/claim_collateral_readonly.spec.js @@ -4,6 +4,7 @@ import { api, chainId, broadcastAndWait, + waitForHeight, baseSeed } from '../../../utils/api.js' import { setup } from './_setup.js' @@ -13,9 +14,10 @@ chai.use(chaiAsPromised) const { expect } = chai const scale8 = 1e8 +const periodLen = 5 describe(`[${process.pid}] calculator: claim collateral readonly`, () => { - let accounts, lpAssetId, investedWavesAmount + let accounts, lpAssetId, investedWavesAmount, startHeight before(async () => { const { height } = await api.blocks.fetchHeight() @@ -23,19 +25,10 @@ describe(`[${process.pid}] calculator: claim collateral readonly`, () => { ({ accounts, lpAssetId } = await setup({ investedWavesAmount, nextBlockToProcess: height, - periodLength: 1 + periodLength: periodLen })) - await broadcastAndWait( - invokeScript( - { - dApp: accounts.factory.address, - call: { function: 'processBlocks', args: [] }, - chainId - }, - accounts.user1.seed - ) - ) + startHeight = height const paymentAmount = 1e8 investedWavesAmount += paymentAmount @@ -149,6 +142,20 @@ describe(`[${process.pid}] calculator: claim collateral readonly`, () => { const newLpInWaves = 100 * 1e8 const claimAmountInWaves = 100 * 1e8 const pwrManagersBonusInWaves = 100 * 1e8 + + await waitForHeight(startHeight + periodLen + 1) + + await broadcastAndWait( + invokeScript( + { + dApp: accounts.factory.address, + call: { function: 'processBlocks', args: [] }, + chainId + }, + accounts.user1.seed + ) + ) + await broadcastAndWait( invokeScript( { diff --git a/contracts/calculator/test/power_share.spec.js b/contracts/calculator/test/power_share.spec.js index e44c92e..a5fd748 100644 --- a/contracts/calculator/test/power_share.spec.js +++ b/contracts/calculator/test/power_share.spec.js @@ -9,7 +9,7 @@ const { expect } = chai describe(`[${process.pid}] calculator: process blocks`, () => { const powerShareRatio = 0.13 - const maxProcessBlocks = 20 // Set in calculator.ride + const maxProcessBlocks = 10 // Set in calculator.ride let accounts, periodLength, blockProcessingReward, powerAssetId before(async () => { From 7640b1075b451ae1afa41158f3a6be0cd9b03a3f Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Tue, 22 Aug 2023 17:15:38 +0300 Subject: [PATCH 136/143] Collateral claim test updates --- .../calculator/test/claim_collateral.spec.js | 29 ++++++++++++++----- .../test/claim_collateral_readonly.spec.js | 23 +++++++++++---- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/contracts/calculator/test/claim_collateral.spec.js b/contracts/calculator/test/claim_collateral.spec.js index 02f0f0b..e784364 100644 --- a/contracts/calculator/test/claim_collateral.spec.js +++ b/contracts/calculator/test/claim_collateral.spec.js @@ -30,7 +30,7 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, call: { function: 'invest', args: [] }, - payment: [{ assetId: null, amount: paymentAmount }], + payment: [{ assetId: null, amount: paymentAmount * 2 }], chainId }, accounts.user1.seed)) }) @@ -106,6 +106,19 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { chainId }, accounts.user1.seed)) + // second withdraw + await broadcastAndWait( + invokeScript( + { + dApp: accounts.factory.address, + call: { function: 'withdraw', args: [] }, + payment: [{ assetId: lpAssetId, amount: paymentAmount }], + chainId + }, + accounts.user1.seed + ) + ) + const newDonatedInWaves = 2000 * 1e8 const newLpInWaves = 1000 * 1e8 const claimAmountInWaves = 100 * 1e8 @@ -133,9 +146,9 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { ] }, payment: [ - { assetId: firstAssetId, amount: paymentAmount }, - { assetId: secondAssetId, amount: paymentAmount }, - { assetId: thirdAssetId, amount: paymentAmount } + { assetId: firstAssetId, amount: paymentAmount * 1 }, + { assetId: secondAssetId, amount: paymentAmount * 2 }, + { assetId: thirdAssetId, amount: paymentAmount * 3 } ], chainId, additionalFee: 4e5 @@ -155,23 +168,23 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { const stateChangesTransfers = stateChanges.invokes[0].stateChanges.invokes[2].stateChanges.transfers const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') - const expectedPrice = Math.floor(newLpInWaves * scale8 / (quantity - paymentAmount)) + const expectedPrice = Math.floor(newLpInWaves * scale8 / (quantity - paymentAmount * 2)) expect(price, 'wrong price').to.equal(expectedPrice) expect(stateChangesTransfers, 'wrong collateral transfers').to.deep.equal([ { address: accounts.user1.address, asset: firstAssetId, - amount: paymentAmount + amount: paymentAmount * 1 / 2 }, { address: accounts.user1.address, asset: secondAssetId, - amount: paymentAmount + amount: paymentAmount * 2 / 2 }, { address: accounts.user1.address, asset: thirdAssetId, - amount: paymentAmount + amount: paymentAmount * 3 / 2 } ]) }) diff --git a/contracts/calculator/test/claim_collateral_readonly.spec.js b/contracts/calculator/test/claim_collateral_readonly.spec.js index 86ceeb8..7e0b1db 100644 --- a/contracts/calculator/test/claim_collateral_readonly.spec.js +++ b/contracts/calculator/test/claim_collateral_readonly.spec.js @@ -37,7 +37,7 @@ describe(`[${process.pid}] calculator: claim collateral readonly`, () => { { dApp: accounts.factory.address, call: { function: 'invest', args: [] }, - payment: [{ assetId: null, amount: paymentAmount }], + payment: [{ assetId: null, amount: paymentAmount * 2 }], chainId }, accounts.user1.seed @@ -138,6 +138,19 @@ describe(`[${process.pid}] calculator: claim collateral readonly`, () => { ) ) + // second withdraw + await broadcastAndWait( + invokeScript( + { + dApp: accounts.factory.address, + call: { function: 'withdraw', args: [] }, + payment: [{ assetId: lpAssetId, amount: paymentAmount }], + chainId + }, + accounts.user1.seed + ) + ) + const newDonatedInWaves = 1000 * 1e8 const newLpInWaves = 100 * 1e8 const claimAmountInWaves = 100 * 1e8 @@ -170,9 +183,9 @@ describe(`[${process.pid}] calculator: claim collateral readonly`, () => { ] }, payment: [ - { assetId: firstAssetId, amount: paymentAmount }, - { assetId: secondAssetId, amount: paymentAmount }, - { assetId: thirdAssetId, amount: paymentAmount } + { assetId: firstAssetId, amount: paymentAmount * 1 }, + { assetId: secondAssetId, amount: paymentAmount * 2 }, + { assetId: thirdAssetId, amount: paymentAmount * 3 } ], chainId, additionalFee: 4e5 @@ -191,7 +204,7 @@ describe(`[${process.pid}] calculator: claim collateral readonly`, () => { const wavesAmount = Math.floor(paymentAmount * price / scale8) const responseString = response.result.value._2.value - const expectedString = `%d%s%s__${wavesAmount}__${firstAssetId}:${secondAssetId}:${thirdAssetId}__${paymentAmount}:${paymentAmount}:${paymentAmount}` + const expectedString = `%d%s%s__${wavesAmount}__${firstAssetId}:${secondAssetId}:${thirdAssetId}__${paymentAmount * 1 / 2}:${paymentAmount * 2 / 2}:${paymentAmount * 3 / 2}` expect(responseString).to.eql(expectedString) }) From ef4a9fe90660a881bdaf0b053a60acdebaff6091 Mon Sep 17 00:00:00 2001 From: Epic waves rider <108883923+epicwavesrider@users.noreply.github.com> Date: Wed, 23 Aug 2023 14:25:44 +0800 Subject: [PATCH 137/143] feat: claimCollateral fix --- contracts/calculator/calculator.ride | 42 +++++++++++++++---- .../calculator/test/claim_collateral.spec.js | 21 +++++++++- .../test/claim_collateral_readonly.spec.js | 1 + 3 files changed, 54 insertions(+), 10 deletions(-) diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index b03d0b2..6ed8056 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -57,6 +57,7 @@ func keyBlockProcessingReward() = "%s__blockProcessingReward" func keyNextBlockToProcess() = "%s__nextBlockToProcess" func keyBlockProcessed(height: Int) = ["%s%d", "blockProcessed", height.toString()].makeString(SEP) func keyWithdrawal() = "%s__withdrawal" +func keyWithdrawalPeriod(period: Int) = ["%s%d", "withdrawalPeriod", period.toString()].makeString(SEP) func keyWithdrawalRequest(userAddress: Address, txId: ByteVector) = ["%s%s%s", "withdrawal", userAddress.toString(), txId.toBase58String()].makeString(SEP) func valueWithdrawalRequest(status: String, lpAssetAmount: Int, targetPeriod: Int, claimTxId: ByteVector|Unit) = { @@ -197,22 +198,46 @@ func claimCollateralINTERNAL(userAddressBytes: ByteVector, txId: ByteVector) = { let withdrawalRequestOption = factoryAddressOrFail .getString(keyWithdrawalRequest(userAddress, txId)) .valueOrErrorMessage(wrapErr("invalid withdrawal request")) - let (status, lpAssetAmount, targetPeriod, claimTxId) = parseWithdrawalRequestValueOrFail(withdrawalRequestOption) - if (currentPeriodOrFail < targetPeriod) then { + let (status, lpAssetAmount, unlockPeriod, claimTxId) = parseWithdrawalRequestValueOrFail(withdrawalRequestOption) + if (currentPeriodOrFail < unlockPeriod) then { throwErr("invalid withdrawal request period") } else { let priceOrFail = - factoryAddressOrFail.getInteger(keyPriceForPeriod(targetPeriod)).valueOrErrorMessage(wrapErr("invalid price")) + factoryAddressOrFail.getInteger(keyPriceForPeriod(unlockPeriod)).valueOrErrorMessage(wrapErr("invalid price")) let wavesAmount = if (priceOrFail > 0) then fraction(lpAssetAmount, priceOrFail, SCALE8) else 0 + let targetPeriod = unlockPeriod - 1 + let assetsString = factoryAddressOrFail.getStringValue( - keyPeriodWithdrawalAssetIds(currentPeriodOrFail) + keyPeriodWithdrawalAssetIds(targetPeriod) ) let amountsString = factoryAddressOrFail.getStringValue( - keyPeriodWithdrawalAmounts(currentPeriodOrFail) + keyPeriodWithdrawalAmounts(targetPeriod) ) - (userAddress, lpAssetAmount, targetPeriod, wavesAmount, assetsString, amountsString) + let totalLpAmountInPeriod = factoryAddressOrFail.getInteger( + keyWithdrawalPeriod(targetPeriod) + ).valueOrElse(0) + + let userPartSCALE8 = if totalLpAmountInPeriod == 0 then { + 0 + } else { + fraction(lpAssetAmount, SCALE8, totalLpAmountInPeriod) + } + + func getUserPartAmounts(currentState: List[String], amount: String) = { + let userPartAmount = fraction(amount.parseIntValue(), userPartSCALE8, SCALE8) + currentState :+ userPartAmount.toString() + } + + let amountsList = amountsString.split_51C(SEP) + let amountsPrefix = amountsList.getElement(0).value() + let amountsListWithoutPrefix = amountsString.split_51C(SEP).removeByIndex(0) + let userPartAmounts = FOLD<10>(amountsListWithoutPrefix, [], getUserPartAmounts) + + let userPartAmountsString = [amountsPrefix, userPartAmounts.makeString(SEP)].makeString(SEP) + + (userAddress, lpAssetAmount, targetPeriod, wavesAmount, assetsString, userPartAmountsString) } } @@ -387,13 +412,14 @@ func finalize( # burn total withdrawal amount factoryAddressOrFail.invoke("burn", [lpAssetAmountToBurn], []), factoryAddressOrFail.invoke("integerEntry", [keyWithdrawal(), 0], []), + factoryAddressOrFail.invoke("integerEntry", [keyWithdrawalPeriod(currentPeriodOrFail), lpAssetAmountToBurn], []), # new invested amount factoryAddressOrFail.invoke("integerEntry", [keyInvested(unit), lpPartInWaves], []), # new donated amount factoryAddressOrFail.invoke("integerEntry", [keyDonated(unit), donationPartInWaves], []), # new period treasury - factoryAddressOrFail.invoke("stringEntry", [keyPeriodWithdrawalAssetIds(newPeriod), AssetIds], []), - factoryAddressOrFail.invoke("stringEntry", [keyPeriodWithdrawalAmounts(newPeriod), Amounts], []) + factoryAddressOrFail.invoke("stringEntry", [keyPeriodWithdrawalAssetIds(currentPeriodOrFail), AssetIds], []), + factoryAddressOrFail.invoke("stringEntry", [keyPeriodWithdrawalAmounts(currentPeriodOrFail), Amounts], []) ] (scriptTransfers, factoryActions) diff --git a/contracts/calculator/test/claim_collateral.spec.js b/contracts/calculator/test/claim_collateral.spec.js index e784364..bf94e7d 100644 --- a/contracts/calculator/test/claim_collateral.spec.js +++ b/contracts/calculator/test/claim_collateral.spec.js @@ -107,7 +107,7 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { }, accounts.user1.seed)) // second withdraw - await broadcastAndWait( + const { id: withdrawTxId2 } = await broadcastAndWait( invokeScript( { dApp: accounts.factory.address, @@ -148,7 +148,8 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { payment: [ { assetId: firstAssetId, amount: paymentAmount * 1 }, { assetId: secondAssetId, amount: paymentAmount * 2 }, - { assetId: thirdAssetId, amount: paymentAmount * 3 } + { assetId: thirdAssetId, amount: paymentAmount * 3 }, + { assetId: null, amount: paymentAmount * 4 } ], chainId, additionalFee: 4e5 @@ -165,6 +166,17 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { chainId }, accounts.user1.seed)) + const { stateChangesSecondClaimCollateral } = await broadcastAndWait(invokeScript({ + dApp: accounts.factory.address, + call: { + function: 'claimCollateral', + args: [ + { type: 'string', value: withdrawTxId2 } + ] + }, + chainId + }, accounts.user1.seed)) + const stateChangesTransfers = stateChanges.invokes[0].stateChanges.invokes[2].stateChanges.transfers const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') @@ -185,6 +197,11 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { address: accounts.user1.address, asset: thirdAssetId, amount: paymentAmount * 3 / 2 + }, + { + address: accounts.user1.address, + asset: null, + amount: paymentAmount * 4 / 2 } ]) }) diff --git a/contracts/calculator/test/claim_collateral_readonly.spec.js b/contracts/calculator/test/claim_collateral_readonly.spec.js index 7e0b1db..d9d094b 100644 --- a/contracts/calculator/test/claim_collateral_readonly.spec.js +++ b/contracts/calculator/test/claim_collateral_readonly.spec.js @@ -203,6 +203,7 @@ describe(`[${process.pid}] calculator: claim collateral readonly`, () => { const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') const wavesAmount = Math.floor(paymentAmount * price / scale8) + console.log(response) const responseString = response.result.value._2.value const expectedString = `%d%s%s__${wavesAmount}__${firstAssetId}:${secondAssetId}:${thirdAssetId}__${paymentAmount * 1 / 2}:${paymentAmount * 2 / 2}:${paymentAmount * 3 / 2}` From 0680bc8c5fcb5e5d1a551bd562aac2e61d4b2f00 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Wed, 23 Aug 2023 09:55:51 +0300 Subject: [PATCH 138/143] Test fixes --- contracts/calculator/test/claim_collateral.spec.js | 6 +++--- contracts/calculator/test/claim_collateral_readonly.spec.js | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/contracts/calculator/test/claim_collateral.spec.js b/contracts/calculator/test/claim_collateral.spec.js index bf94e7d..cece8e2 100644 --- a/contracts/calculator/test/claim_collateral.spec.js +++ b/contracts/calculator/test/claim_collateral.spec.js @@ -99,7 +99,7 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { additionalFee: 4e5 }, baseSeed)) - const { id: withdrawTxId } = await broadcastAndWait(invokeScript({ + const { id: withdrawTxId1 } = await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, call: { function: 'withdraw', args: [] }, payment: [{ assetId: lpAssetId, amount: paymentAmount }], @@ -160,13 +160,13 @@ describe(`[${process.pid}] calculator: claim collateral`, () => { call: { function: 'claimCollateral', args: [ - { type: 'string', value: withdrawTxId } + { type: 'string', value: withdrawTxId1 } ] }, chainId }, accounts.user1.seed)) - const { stateChangesSecondClaimCollateral } = await broadcastAndWait(invokeScript({ + await broadcastAndWait(invokeScript({ dApp: accounts.factory.address, call: { function: 'claimCollateral', diff --git a/contracts/calculator/test/claim_collateral_readonly.spec.js b/contracts/calculator/test/claim_collateral_readonly.spec.js index d9d094b..7e0b1db 100644 --- a/contracts/calculator/test/claim_collateral_readonly.spec.js +++ b/contracts/calculator/test/claim_collateral_readonly.spec.js @@ -203,7 +203,6 @@ describe(`[${process.pid}] calculator: claim collateral readonly`, () => { const { value: price } = await api.addresses.fetchDataKey(accounts.factory.address, '%s%d__price__1') const wavesAmount = Math.floor(paymentAmount * price / scale8) - console.log(response) const responseString = response.result.value._2.value const expectedString = `%d%s%s__${wavesAmount}__${firstAssetId}:${secondAssetId}:${thirdAssetId}__${paymentAmount * 1 / 2}:${paymentAmount * 2 / 2}:${paymentAmount * 3 / 2}` From 0a473ccd122f818237e9e6121a18eb57e05ab857 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Wed, 6 Dec 2023 15:13:53 +0300 Subject: [PATCH 139/143] l2mp finalization --- contracts/calculator/calculator.ride | 30 ++++++-- contracts/calculator/test/_setup.js | 22 +++++- .../test/finalizeMultiPayment.spec.js | 71 +++++++++++++++++-- migrations/2023_12_06_factory_data_tx.json | 19 +++++ 4 files changed, 129 insertions(+), 13 deletions(-) create mode 100644 migrations/2023_12_06_factory_data_tx.json diff --git a/contracts/calculator/calculator.ride b/contracts/calculator/calculator.ride index 6ed8056..71b6c7f 100644 --- a/contracts/calculator/calculator.ride +++ b/contracts/calculator/calculator.ride @@ -42,6 +42,8 @@ func keyBusinessTreasuryPart() = ["%s", "businessTreasuryPart"].makeString(SEP) func keyPowerContractAddress() = ["%s", "powerContract"].makeString(SEP) func keyPowerShareRatio() = ["%s", "powerShareRatio"].makeString(SEP) # Scale 10^8, For example 0.2 = 2000_0000 func keyPowerAssetId() = ["%s", "powerAssetId"].makeString(SEP) +func keyL2mpAssetId() = ["%s", "l2mpAssetId"].makeString(SEP) +func keyL2mpProxyAddress() = ["%s", "l2mpProxy"].makeString(SEP) func keyInvested(assetId: ByteVector|Unit) = ["%s%s", "invested", assetIdToString(assetId)].makeString(SEP) func keyDonated(assetId: ByteVector|Unit) = ["%s%s", "donated", assetIdToString(assetId)].makeString(SEP) func keyAvailable(userAddress: Address) = ["%s%s", "available", userAddress.toString()].makeString(SEP) @@ -143,6 +145,17 @@ let powerContractAddressOption = match factoryAddressOption { let powerContractAddressOrFail = powerContractAddressOption.valueOrErrorMessage(wrapErr("invalid power contract address")) let powerAssetIdStringOrFail = factoryAddressOrFail.getString(keyPowerAssetId()).valueOrErrorMessage(wrapErr("power asset id not found")) +let l2mpProxyAddressOption = match factoryAddressOption { + case a: Address => match a.getString(keyL2mpProxyAddress()) { + case s: String => s.addressFromString() + case _: Unit => unit + } + case _: Unit => unit +} +let l2mpProxyAddressOrFail = l2mpProxyAddressOption.valueOrErrorMessage(wrapErr("invalid l2mp proxy address")) + +let l2mpAssetIdStringOrFail = factoryAddressOrFail.getString(keyL2mpAssetId()).valueOrErrorMessage(wrapErr("l2mp asset id not found")) + func getManagerPublicKeyOrUnit() = { match (factoryAddressOption) { case fa:Address => { @@ -386,11 +399,18 @@ func finalize( let paymentAmount = payment.amount let paymentAssetId = payment.assetId - let newAssetIdsString = "%s" + [assetIdsString, paymentAssetId.assetIdToString()].makeString(SEP) - let newAmountsString = "%d" + [amountsString, paymentAmount.toString()].makeString(SEP) - let newScriptTransfer = ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId) + # If payment is L2MP send it to proxy address + if (paymentAssetId.assetIdToString() == l2mpAssetIdStringOrFail) then { + let transferToL2mpProxy = ScriptTransfer(l2mpProxyAddressOrFail, paymentAmount, paymentAssetId) - (scriptTransfers :+ newScriptTransfer, newAssetIdsString, newAmountsString) + (scriptTransfers :+ transferToL2mpProxy, assetIdsString, amountsString) + } else { + let newAssetIdsString = "%s" + [assetIdsString, paymentAssetId.assetIdToString()].makeString(SEP) + let newAmountsString = "%d" + [amountsString, paymentAmount.toString()].makeString(SEP) + let newScriptTransfer = ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId) + + (scriptTransfers :+ newScriptTransfer, newAssetIdsString, newAmountsString) + } } let (scriptTransfers, AssetIds, Amounts) = FOLD<10>(i.payments, ([], "", ""), addNewAction) @@ -604,7 +624,7 @@ func claimCollateral(userAddressBytes: ByteVector, txId: String) = { ) = claimCollateralINTERNAL(userAddressBytes, txId.fromBase58String()) let assetsList = assetsString.split_51C(SEP).removeByIndex(0) - let amountsList = amountsString.split_51C(SEP).removeByIndex(0) + let amountsList = amountsString.split_51C(SEP).removeByIndex(0) let factoryActions = [ factoryAddressOrFail.invoke("deleteEntry", [ diff --git a/contracts/calculator/test/_setup.js b/contracts/calculator/test/_setup.js index 44c81fe..5afea69 100644 --- a/contracts/calculator/test/_setup.js +++ b/contracts/calculator/test/_setup.js @@ -41,6 +41,7 @@ export const setup = async ({ 'businessTreasury', 'powerContract', 'swapContract', + 'l2mpProxy', 'user1' ] const accounts = Object.fromEntries(names.map((item) => { @@ -97,6 +98,21 @@ export const setup = async ({ chainId }, accounts.treasury.seed)) + const { id: l2mpAssetId } = await broadcastAndWait(issue({ + name: 'L2MP', + description: 'L2MP', + quantity: powerAmountToIssue, + decimals: 8, + reissuable: true, + chainId + }, accounts.treasury.seed)) + + await broadcastAndWait(massTransfer({ + transfers: Object.values(accounts).map(({ address }) => ({ recipient: address, amount })), + assetId: l2mpAssetId, + chainId + }, accounts.treasury.seed)) + await broadcastAndWait(data({ additionalFee: 4e5, data: [ @@ -133,7 +149,9 @@ export const setup = async ({ { key: '%s__investPeriodLength', type: 'integer', value: investPeriodLength }, { key: '%s__blockProcessingReward', type: 'integer', value: blockProcessingReward }, { key: '%s%s__invested__WAVES', type: 'integer', value: investedWavesAmount }, - { key: '%s%s__donated__WAVES', type: 'integer', value: donatedWavesAmount } + { key: '%s%s__donated__WAVES', type: 'integer', value: donatedWavesAmount }, + { key: '%s__l2mpAssetId', type: 'string', value: l2mpAssetId }, + { key: '%s__l2mpProxy', type: 'string', value: accounts.l2mpProxy.address } ], chainId }, accounts.factory.seed)) @@ -144,5 +162,5 @@ export const setup = async ({ await setScriptFromFile(powerContractPath, accounts.powerContract.seed) await setScriptFromFile(swapContractPath, accounts.swapContract.seed) - return { accounts, lpAssetId, powerAssetId, periodLength, blockProcessingReward, price } + return { accounts, lpAssetId, powerAssetId, periodLength, blockProcessingReward, price, l2mpAssetId } } diff --git a/contracts/calculator/test/finalizeMultiPayment.spec.js b/contracts/calculator/test/finalizeMultiPayment.spec.js index d2e2c01..806432e 100644 --- a/contracts/calculator/test/finalizeMultiPayment.spec.js +++ b/contracts/calculator/test/finalizeMultiPayment.spec.js @@ -8,8 +8,8 @@ chai.use(chaiAsPromised) const { expect } = chai describe(`[${process.pid}] calculator: finalizeMultiPayment`, () => { - let accounts - const paymentAmount = 1 + let accounts, l2mpAssetId + const paymentAmount = 123 const periodLength = 1 const initialLpInWaves = 5000 * 1e8 const initialDonatedInWaves = 3000 * 1e8 @@ -21,7 +21,7 @@ describe(`[${process.pid}] calculator: finalizeMultiPayment`, () => { before(async () => { const { height } = await api.blocks.fetchHeight(); - ({ accounts } = await setup({ + ({ accounts, l2mpAssetId } = await setup({ nextBlockToProcess: height, periodLength, blockProcessingReward, @@ -94,6 +94,27 @@ describe(`[${process.pid}] calculator: finalizeMultiPayment`, () => { additionalFee: 4e5 }, baseSeed)) + // const { id: l2mpAssetId } = await broadcastAndWait( + // issue( + // { + // name: 'l2mpAsset', + // description: '', + // quantity: 10e8, + // decimals: 8, + // reissuable: true, + // chainId + // }, + // baseSeed + // ) + // ) + + // await broadcastAndWait(transfer({ + // recipient: accounts.mainTreasury.address, + // amount: 10e8, + // assetId: l2mpAssetId, + // additionalFee: 4e5 + // }, baseSeed)) + await broadcastAndWait( invokeScript( { @@ -120,6 +141,16 @@ describe(`[${process.pid}] calculator: finalizeMultiPayment`, () => { thirdAssetId ) + const { balance: factoryL2mpAssetBalanceBefore } = await api.assets.fetchBalanceAddressAssetId( + accounts.factory.address, + l2mpAssetId + ) + + const { balance: l2mpProxyL2mpAssetBalanceBefore } = await api.assets.fetchBalanceAddressAssetId( + accounts.l2mpProxy.address, + l2mpAssetId + ) + await broadcastAndWait( invokeScript( { @@ -136,7 +167,8 @@ describe(`[${process.pid}] calculator: finalizeMultiPayment`, () => { payment: [ { assetId: firstAssetId, amount: paymentAmount }, { assetId: secondAssetId, amount: paymentAmount }, - { assetId: thirdAssetId, amount: paymentAmount } + { assetId: thirdAssetId, amount: paymentAmount }, + { assetId: l2mpAssetId, amount: paymentAmount } ], chainId, additionalFee: 4e5 @@ -147,7 +179,7 @@ describe(`[${process.pid}] calculator: finalizeMultiPayment`, () => { const { balance: factoryFirstAssetBalanceAfter } = await api.assets.fetchBalanceAddressAssetId( accounts.factory.address, - secondAssetId + firstAssetId ) const { balance: factorySecondAssetBalanceAfter } = await api.assets.fetchBalanceAddressAssetId( @@ -157,15 +189,42 @@ describe(`[${process.pid}] calculator: finalizeMultiPayment`, () => { const { balance: factoryThirdAssetBalanceAfter } = await api.assets.fetchBalanceAddressAssetId( accounts.factory.address, - secondAssetId + thirdAssetId + ) + + const { balance: factoryL2mpAssetBalanceAfter } = await api.assets.fetchBalanceAddressAssetId( + accounts.factory.address, + l2mpAssetId + ) + + const { balance: l2mpProxyL2mpAssetBalanceAfter } = await api.assets.fetchBalanceAddressAssetId( + accounts.l2mpProxy.address, + l2mpAssetId + ) + + const rewardAssetsString = await api.addresses.fetchDataKey( + accounts.factory.address, + '%s%d__periodReward__0' + ) + + const rewardAmountsString = await api.addresses.fetchDataKey( + accounts.factory.address, + '%s%d__periodRewardAmount__0' ) const expectedFactoryFirstAssetBalance = factoryFirstAssetBalanceBefore + paymentAmount const expectedFactorySecondAssetBalance = factorySecondAssetBalanceBefore + paymentAmount const expectedFactoryThirdAssetBalance = factoryThirdAssetBalanceBefore + paymentAmount + const expectedFactoryL2mpAssetBalance = factoryL2mpAssetBalanceBefore + const expectedL2mpProxyL2mpAssetBalance = l2mpProxyL2mpAssetBalanceBefore + paymentAmount expect(factoryFirstAssetBalanceAfter, 'invalid factory first asset balance').to.equal(expectedFactoryFirstAssetBalance) expect(factorySecondAssetBalanceAfter, 'invalid factory second asset balance').to.equal(expectedFactorySecondAssetBalance) expect(factoryThirdAssetBalanceAfter, 'invalid factory third asset balance').to.equal(expectedFactoryThirdAssetBalance) + expect(factoryL2mpAssetBalanceAfter, 'invalid factory l2mp asset balance').to.equal(expectedFactoryL2mpAssetBalance) + expect(l2mpProxyL2mpAssetBalanceAfter, 'invalid L2MP Proxy l2mp asset balance').to.equal(expectedL2mpProxyL2mpAssetBalance) + + expect(rewardAssetsString.value).to.eql(`%s%s%s__${firstAssetId}__${secondAssetId}__${thirdAssetId}`) + expect(rewardAmountsString.value).to.eql(`%d%d%d__${paymentAmount}__${paymentAmount}__${paymentAmount}`) }) }) diff --git a/migrations/2023_12_06_factory_data_tx.json b/migrations/2023_12_06_factory_data_tx.json new file mode 100644 index 0000000..8493e86 --- /dev/null +++ b/migrations/2023_12_06_factory_data_tx.json @@ -0,0 +1,19 @@ +{ + "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", + "data": [ + { + "key": "%s__l2mpAssetId", + "type": "string", + "value": "7scqyYoVsNrpWbTAc78eRqNVcYLxMPzZs8EQfX7ruJAg" + }, + { + "key": "%s__l2mpProxy", + "type": "string", + "value": "" + } + ], + "proofs": [], + "fee": 500000, + "type": 12, + "version": 2 +} From fa3278fb2bbdfb2221c165aec72c3df6db815b38 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Fri, 8 Dec 2023 10:37:51 +0300 Subject: [PATCH 140/143] Migration json files --- migrations/withdrawals/close_withdraw.mjs | 60 + migrations/withdrawals/factory_dataTx_0.json | 458 ++++ migrations/withdrawals/factory_dataTx_1.json | 458 ++++ migrations/withdrawals/factory_dataTx_2.json | 458 ++++ migrations/withdrawals/factory_dataTx_3.json | 458 ++++ migrations/withdrawals/factory_dataTx_4.json | 458 ++++ migrations/withdrawals/factory_dataTx_5.json | 458 ++++ migrations/withdrawals/factory_dataTx_6.json | 458 ++++ migrations/withdrawals/factory_dataTx_7.json | 305 +++ .../withdrawals/withdraw_keys_backup.json | 1947 +++++++++++++++++ 10 files changed, 5518 insertions(+) create mode 100644 migrations/withdrawals/close_withdraw.mjs create mode 100644 migrations/withdrawals/factory_dataTx_0.json create mode 100644 migrations/withdrawals/factory_dataTx_1.json create mode 100644 migrations/withdrawals/factory_dataTx_2.json create mode 100644 migrations/withdrawals/factory_dataTx_3.json create mode 100644 migrations/withdrawals/factory_dataTx_4.json create mode 100644 migrations/withdrawals/factory_dataTx_5.json create mode 100644 migrations/withdrawals/factory_dataTx_6.json create mode 100644 migrations/withdrawals/factory_dataTx_7.json create mode 100644 migrations/withdrawals/withdraw_keys_backup.json diff --git a/migrations/withdrawals/close_withdraw.mjs b/migrations/withdrawals/close_withdraw.mjs new file mode 100644 index 0000000..56ab08a --- /dev/null +++ b/migrations/withdrawals/close_withdraw.mjs @@ -0,0 +1,60 @@ +import { data } from '@waves/waves-transactions' +import { writeFile } from 'fs' + +const chainId = 'W' +const nodeUrl = 'https://nodes.wx.network' +const dataUrl = nodeUrl + '/addresses/data/' +const keyRegEx = '?matches=%s%s%s__withdrawal__.*' +const SEP = '__' +const withdrawPeriod = '2' + +const factoryAddress = '3PJVm7xLPabmYohbnvdgGDYHMwnZxF2x18m' +const factoryPubKey = '7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He' + +const addrDataUrl = dataUrl + factoryAddress + keyRegEx +const req = fetch(encodeURI(addrDataUrl)) + +req.then((res) => { + res.json().then((jsonData) => { + // Filter out withdrawals from different period + const filteredJsonData = jsonData.filter((el) => el.value.split(SEP)[3] === withdrawPeriod) + console.log(jsonData.length, filteredJsonData.length) + console.log('=============') + + const chunkSize = 50 + for (let i = 0; i < filteredJsonData.length; i += chunkSize) { + const chunk = filteredJsonData.slice(i, i + chunkSize) + + const stateData = [] + for (const c of chunk) { + const keyArr = c.key.split(SEP) + const userAddress = keyArr[2] + const txId = keyArr[3] + + const valArr = c.value.split(SEP) + const lpAmount = valArr[2] + + const withdrawHistoryKey = `%s%s%s__withdrawalHistory__${userAddress}__${txId}` + + stateData.push({ key: c.key, value: null }) + stateData.push({ key: withdrawHistoryKey, type: 'integer', value: parseInt(lpAmount) }) + } + console.log(stateData.length) + + const dataTx = data({ + data: stateData, + chainId, + additionalFee: 4e5, + senderPublicKey: factoryPubKey + }) + + delete dataTx.timestamp + delete dataTx.proofs + delete dataTx.id + delete dataTx.chainId + + const fileName = `factory_dataTx_${parseInt(i / chunkSize)}.json` + writeFile(fileName, JSON.stringify(dataTx), (err) => { console.log(err) }) + } + }) +}) diff --git a/migrations/withdrawals/factory_dataTx_0.json b/migrations/withdrawals/factory_dataTx_0.json new file mode 100644 index 0000000..e2b9523 --- /dev/null +++ b/migrations/withdrawals/factory_dataTx_0.json @@ -0,0 +1,458 @@ +{ + "type": 12, + "version": 2, + "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", + "fee": 1500000, + "data": [ + { + "key": "%s%s%s__withdrawal__3P27ZRM8NKKxbWCRRUV8gU1BgXjPN9xhae4__2erDnnLXGjMovcD6dtuyGyihNo6brF22PsBHBZ4mNxH3", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P27ZRM8NKKxbWCRRUV8gU1BgXjPN9xhae4__2erDnnLXGjMovcD6dtuyGyihNo6brF22PsBHBZ4mNxH3", + "type": "integer", + "value": 38845806966 + }, + { + "key": "%s%s%s__withdrawal__3P27ZRM8NKKxbWCRRUV8gU1BgXjPN9xhae4__3f7KgNZFV8abNw8MyWqEtfCF5dj4eQCAi22tfbzjiww3", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P27ZRM8NKKxbWCRRUV8gU1BgXjPN9xhae4__3f7KgNZFV8abNw8MyWqEtfCF5dj4eQCAi22tfbzjiww3", + "type": "integer", + "value": 66031407455 + }, + { + "key": "%s%s%s__withdrawal__3P27ZRM8NKKxbWCRRUV8gU1BgXjPN9xhae4__H9DJRFBe8eVugkjuFo1GQvw5vKeXwWH1vtZnP3Mjr9nN", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P27ZRM8NKKxbWCRRUV8gU1BgXjPN9xhae4__H9DJRFBe8eVugkjuFo1GQvw5vKeXwWH1vtZnP3Mjr9nN", + "type": "integer", + "value": 1000000000 + }, + { + "key": "%s%s%s__withdrawal__3P28abJrxAfRfvS5bkJrptGB1pKjqQpJBRN__HKcjB27v3sKJBTQ7X34diHbMcB6VaQiLJEMkuAGWJ5YP", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P28abJrxAfRfvS5bkJrptGB1pKjqQpJBRN__HKcjB27v3sKJBTQ7X34diHbMcB6VaQiLJEMkuAGWJ5YP", + "type": "integer", + "value": 1907328148 + }, + { + "key": "%s%s%s__withdrawal__3P28givMmcWHShNnediwXnduqRuvURXCNJa__9AkcBpoiE6JWS6kvtN4PggQ2gGrvEFFxyW3hjd5HcA9X", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P28givMmcWHShNnediwXnduqRuvURXCNJa__9AkcBpoiE6JWS6kvtN4PggQ2gGrvEFFxyW3hjd5HcA9X", + "type": "integer", + "value": 5000000000 + }, + { + "key": "%s%s%s__withdrawal__3P28givMmcWHShNnediwXnduqRuvURXCNJa__EUUHnusTxjxeV9pREp2ZL2pGrd759aXngSChXMeBwPF4", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P28givMmcWHShNnediwXnduqRuvURXCNJa__EUUHnusTxjxeV9pREp2ZL2pGrd759aXngSChXMeBwPF4", + "type": "integer", + "value": 1487910528 + }, + { + "key": "%s%s%s__withdrawal__3P28givMmcWHShNnediwXnduqRuvURXCNJa__FTknmrqxkzLttQMzQgsx4K9B84swKCyrjJnaJnqHgYkz", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P28givMmcWHShNnediwXnduqRuvURXCNJa__FTknmrqxkzLttQMzQgsx4K9B84swKCyrjJnaJnqHgYkz", + "type": "integer", + "value": 100077726 + }, + { + "key": "%s%s%s__withdrawal__3P2CehRGv7JNCpS91ksqLwVdtyFz3LZ5y2L__A3TDK7zXCdvQkTPpMFhPVaSENynHfGRJpUsAYkGrMfvE", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P2CehRGv7JNCpS91ksqLwVdtyFz3LZ5y2L__A3TDK7zXCdvQkTPpMFhPVaSENynHfGRJpUsAYkGrMfvE", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s%s__withdrawal__3P2FMHavshKyciyu8cHvkVjkwppqXmz7nWm__5hdHLv4mvdkacS2APJpJmDxfx89cbis9ttKMjiV7F1s", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P2FMHavshKyciyu8cHvkVjkwppqXmz7nWm__5hdHLv4mvdkacS2APJpJmDxfx89cbis9ttKMjiV7F1s", + "type": "integer", + "value": 971000000 + }, + { + "key": "%s%s%s__withdrawal__3P2FMHavshKyciyu8cHvkVjkwppqXmz7nWm__BFLgdNULfw4r33pMuJfDG2GhvLwH8BUdssL5rPsZqDpp", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P2FMHavshKyciyu8cHvkVjkwppqXmz7nWm__BFLgdNULfw4r33pMuJfDG2GhvLwH8BUdssL5rPsZqDpp", + "type": "integer", + "value": 28481081050 + }, + { + "key": "%s%s%s__withdrawal__3P2FMHavshKyciyu8cHvkVjkwppqXmz7nWm__Fj76Cw6M3kt8kqQbKLAQMMbZ3W368ZAFTHN2MoHG4VA6", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P2FMHavshKyciyu8cHvkVjkwppqXmz7nWm__Fj76Cw6M3kt8kqQbKLAQMMbZ3W368ZAFTHN2MoHG4VA6", + "type": "integer", + "value": 1040512831 + }, + { + "key": "%s%s%s__withdrawal__3P2NgWPbG6QhHX1dTUmdNyEW894Sq5AjTNr__CbPQQX5tL5kUkHDA6uHmdXYkyHL1xsZCj9Vd3WUEUwi5", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P2NgWPbG6QhHX1dTUmdNyEW894Sq5AjTNr__CbPQQX5tL5kUkHDA6uHmdXYkyHL1xsZCj9Vd3WUEUwi5", + "type": "integer", + "value": 4353272888 + }, + { + "key": "%s%s%s__withdrawal__3P2NoApfXJWbSL2NsV21ug1CrpU8rnFk88W__9ahnxiQJ8wGmaswMMKakESaS2fEZYDix257ys2CL9Ksv", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P2NoApfXJWbSL2NsV21ug1CrpU8rnFk88W__9ahnxiQJ8wGmaswMMKakESaS2fEZYDix257ys2CL9Ksv", + "type": "integer", + "value": 100000000000 + }, + { + "key": "%s%s%s__withdrawal__3P2NoApfXJWbSL2NsV21ug1CrpU8rnFk88W__F5WhjK27ZuVmezaxZsMWQsP1NwVRAkahf2yG78eC5sMM", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P2NoApfXJWbSL2NsV21ug1CrpU8rnFk88W__F5WhjK27ZuVmezaxZsMWQsP1NwVRAkahf2yG78eC5sMM", + "type": "integer", + "value": 200000000000 + }, + { + "key": "%s%s%s__withdrawal__3P2NoApfXJWbSL2NsV21ug1CrpU8rnFk88W__FKtND7XDYE6Cb3yRdk7UmLDNg8CtM9aBgUELm8AD1pvP", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P2NoApfXJWbSL2NsV21ug1CrpU8rnFk88W__FKtND7XDYE6Cb3yRdk7UmLDNg8CtM9aBgUELm8AD1pvP", + "type": "integer", + "value": 300000000000 + }, + { + "key": "%s%s%s__withdrawal__3P339s9WVxF2zGC2ew8NPzjRWbLvyTdqc9n__A7yqU6geUEPSSgaugqPKC5UXAJeumu6eM7Nn2e42sj6v", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P339s9WVxF2zGC2ew8NPzjRWbLvyTdqc9n__A7yqU6geUEPSSgaugqPKC5UXAJeumu6eM7Nn2e42sj6v", + "type": "integer", + "value": 31491902612 + }, + { + "key": "%s%s%s__withdrawal__3P339s9WVxF2zGC2ew8NPzjRWbLvyTdqc9n__CQkEnTbFrBmHdyoRwUJpy5cWtcsn6PvGA1GftmkZYkbw", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P339s9WVxF2zGC2ew8NPzjRWbLvyTdqc9n__CQkEnTbFrBmHdyoRwUJpy5cWtcsn6PvGA1GftmkZYkbw", + "type": "integer", + "value": 11755145053 + }, + { + "key": "%s%s%s__withdrawal__3P33D6UePSWhgdL9PfB9Mm4rVSTJrgV7i47__3263iZubvm3UL7fB8sh1EMUTzacU21NuvvbcyxLSLZKh", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P33D6UePSWhgdL9PfB9Mm4rVSTJrgV7i47__3263iZubvm3UL7fB8sh1EMUTzacU21NuvvbcyxLSLZKh", + "type": "integer", + "value": 1899500000 + }, + { + "key": "%s%s%s__withdrawal__3P33D6UePSWhgdL9PfB9Mm4rVSTJrgV7i47__6z7fRSiAGKQ3hXm7AVjqNdvvXnyTrShyJ714ty3edz6d", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P33D6UePSWhgdL9PfB9Mm4rVSTJrgV7i47__6z7fRSiAGKQ3hXm7AVjqNdvvXnyTrShyJ714ty3edz6d", + "type": "integer", + "value": 8167850000 + }, + { + "key": "%s%s%s__withdrawal__3P33D6UePSWhgdL9PfB9Mm4rVSTJrgV7i47__HrgqWk2wCVvJVhccFiUKr4AMvgEYQvfXxYPK7dokxfTi", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P33D6UePSWhgdL9PfB9Mm4rVSTJrgV7i47__HrgqWk2wCVvJVhccFiUKr4AMvgEYQvfXxYPK7dokxfTi", + "type": "integer", + "value": 1899500000 + }, + { + "key": "%s%s%s__withdrawal__3P33dk2pYeVQiVuA9BCE4mTe1nnamrzeb2A__2w7DogsSbAiuzJMigbbt6CzR6T582w1xR6hXwck5TH9g", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P33dk2pYeVQiVuA9BCE4mTe1nnamrzeb2A__2w7DogsSbAiuzJMigbbt6CzR6T582w1xR6hXwck5TH9g", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s%s__withdrawal__3P3CQeeTztHw3YMdneUZgLoHQ6zvRp1eWpF__3ccw6uEPjMskBSABt4L8k74ytrMzq8o8g4Cs53wpwsYo", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P3CQeeTztHw3YMdneUZgLoHQ6zvRp1eWpF__3ccw6uEPjMskBSABt4L8k74ytrMzq8o8g4Cs53wpwsYo", + "type": "integer", + "value": 1583426545 + }, + { + "key": "%s%s%s__withdrawal__3P3JvkynkGuWCaT9WZ51T1muJdtqrEogxE3__C3UkhbvwQznXVn5yxzpmfZFnPXKxVYtTdsFGqPbeZqD1", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P3JvkynkGuWCaT9WZ51T1muJdtqrEogxE3__C3UkhbvwQznXVn5yxzpmfZFnPXKxVYtTdsFGqPbeZqD1", + "type": "integer", + "value": 2510408011 + }, + { + "key": "%s%s%s__withdrawal__3P3RD3yJW2gQ9dSVwVVDVCQiFWqaLtZcyzH__B9HdgnhgV2yL2FoCT1fyhz2FiHk1iJcd8XfmNCVqN7s3", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P3RD3yJW2gQ9dSVwVVDVCQiFWqaLtZcyzH__B9HdgnhgV2yL2FoCT1fyhz2FiHk1iJcd8XfmNCVqN7s3", + "type": "integer", + "value": 4178900000 + }, + { + "key": "%s%s%s__withdrawal__3P3RD3yJW2gQ9dSVwVVDVCQiFWqaLtZcyzH__Bc5i8BNT7rQ2EEbvesm5r81eo6PfDSJw8Heht91tmnyE", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P3RD3yJW2gQ9dSVwVVDVCQiFWqaLtZcyzH__Bc5i8BNT7rQ2EEbvesm5r81eo6PfDSJw8Heht91tmnyE", + "type": "integer", + "value": 13207687500 + }, + { + "key": "%s%s%s__withdrawal__3P3RD3yJW2gQ9dSVwVVDVCQiFWqaLtZcyzH__EDfeEnDL3NuFmcSbBvGn1TMKWALg4wYQVn9JkFp39oio", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P3RD3yJW2gQ9dSVwVVDVCQiFWqaLtZcyzH__EDfeEnDL3NuFmcSbBvGn1TMKWALg4wYQVn9JkFp39oio", + "type": "integer", + "value": 3419100000 + }, + { + "key": "%s%s%s__withdrawal__3P3aayN8kE6gXo7jSki7WUJHdTAF4X4S9xA__AjArMEkW7J7yZnEH7sopoy2e7QqHToySxMztKHFuzkTf", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P3aayN8kE6gXo7jSki7WUJHdTAF4X4S9xA__AjArMEkW7J7yZnEH7sopoy2e7QqHToySxMztKHFuzkTf", + "type": "integer", + "value": 1329650000 + }, + { + "key": "%s%s%s__withdrawal__3P3aayN8kE6gXo7jSki7WUJHdTAF4X4S9xA__CBSiZjDXZVoeRpJA23MDKTrsTuTgv4TU2UTi56civcKD", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P3aayN8kE6gXo7jSki7WUJHdTAF4X4S9xA__CBSiZjDXZVoeRpJA23MDKTrsTuTgv4TU2UTi56civcKD", + "type": "integer", + "value": 88511237500 + }, + { + "key": "%s%s%s__withdrawal__3P3qMfjsxSZzED5uCNNCM9bCtc1UqNDLUSM__EsgxeU5D8CJxvmCeuiGaT4HSNb4o6uSd8XKxmMf8H6HY", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P3qMfjsxSZzED5uCNNCM9bCtc1UqNDLUSM__EsgxeU5D8CJxvmCeuiGaT4HSNb4o6uSd8XKxmMf8H6HY", + "type": "integer", + "value": 58276590561 + }, + { + "key": "%s%s%s__withdrawal__3P4HvMuStrxyJ2eBzUdFTKvju4mCbELNK7K__9DWHGjocwesKcgvRpU6NaoyiLHEr9e39WQ4GxncTqaoU", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4HvMuStrxyJ2eBzUdFTKvju4mCbELNK7K__9DWHGjocwesKcgvRpU6NaoyiLHEr9e39WQ4GxncTqaoU", + "type": "integer", + "value": 719003736 + }, + { + "key": "%s%s%s__withdrawal__3P4HvMuStrxyJ2eBzUdFTKvju4mCbELNK7K__BGCF5uhUHCLNG56Ub8hifgYejAe6i46pc1cixFud85zT", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4HvMuStrxyJ2eBzUdFTKvju4mCbELNK7K__BGCF5uhUHCLNG56Ub8hifgYejAe6i46pc1cixFud85zT", + "type": "integer", + "value": 9020254085 + }, + { + "key": "%s%s%s__withdrawal__3P4HvMuStrxyJ2eBzUdFTKvju4mCbELNK7K__HUdEAPptXXxUeachuZKpG6nit3YyfADZGPqrEfUkxMc4", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4HvMuStrxyJ2eBzUdFTKvju4mCbELNK7K__HUdEAPptXXxUeachuZKpG6nit3YyfADZGPqrEfUkxMc4", + "type": "integer", + "value": 1845176664 + }, + { + "key": "%s%s%s__withdrawal__3P4RLw7ubKWVfgvQ8nRWhNtGxvSJyEw47Np__HZ4WYPXoRnSfmWrYsMx8r7vWeVyp8vTn571WEvXzi7au", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4RLw7ubKWVfgvQ8nRWhNtGxvSJyEw47Np__HZ4WYPXoRnSfmWrYsMx8r7vWeVyp8vTn571WEvXzi7au", + "type": "integer", + "value": 3988950000 + }, + { + "key": "%s%s%s__withdrawal__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__483h9oBo9UEQ4bt3er93wGirGVwFcKfAGEHXvcifQ69e", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__483h9oBo9UEQ4bt3er93wGirGVwFcKfAGEHXvcifQ69e", + "type": "integer", + "value": 237725327254 + }, + { + "key": "%s%s%s__withdrawal__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__4iTmtqNzxDXNfxohUGfjvMMCEZWxjQmW8kwn69gVhaYR", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__4iTmtqNzxDXNfxohUGfjvMMCEZWxjQmW8kwn69gVhaYR", + "type": "integer", + "value": 97114511603 + }, + { + "key": "%s%s%s__withdrawal__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__55vJnp6yNfZYTmgmqVh9wcvbuqzG4TzRSYo1epKhPcG", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__55vJnp6yNfZYTmgmqVh9wcvbuqzG4TzRSYo1epKhPcG", + "type": "integer", + "value": 26724688656 + }, + { + "key": "%s%s%s__withdrawal__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__EeCy1WWZbyr3oEawiAnuidYerz471iM3DVF38okPWoJk", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__EeCy1WWZbyr3oEawiAnuidYerz471iM3DVF38okPWoJk", + "type": "integer", + "value": 13275311342 + }, + { + "key": "%s%s%s__withdrawal__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__EtmgouUpzdAVFV4CdHvHRAT9zJfWkCA5QRpzJrNnJWmT", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__EtmgouUpzdAVFV4CdHvHRAT9zJfWkCA5QRpzJrNnJWmT", + "type": "integer", + "value": 41767342725 + }, + { + "key": "%s%s%s__withdrawal__3P4fgnb6jYPE7jC6HvyZDZstWCrmct7X5BF__9wpxySCQyd5eer3u6cgQEvLCnnfZypMwZ5c8sM314gqa", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4fgnb6jYPE7jC6HvyZDZstWCrmct7X5BF__9wpxySCQyd5eer3u6cgQEvLCnnfZypMwZ5c8sM314gqa", + "type": "integer", + "value": 48643007215 + }, + { + "key": "%s%s%s__withdrawal__3P4qgN1sXCuxdMP9z4cBftBAyTxtqgqsCqd__4YaTV6dsqEVeMszgmupcpHE7DXkzPirhyGxnRjgH2t7X", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4qgN1sXCuxdMP9z4cBftBAyTxtqgqsCqd__4YaTV6dsqEVeMszgmupcpHE7DXkzPirhyGxnRjgH2t7X", + "type": "integer", + "value": 18879223625 + }, + { + "key": "%s%s%s__withdrawal__3P4qgN1sXCuxdMP9z4cBftBAyTxtqgqsCqd__BLqcYKu6SGcsRB8ucDn9AGtCkPL8Dkyj9xm7KRaQ1cm8", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4qgN1sXCuxdMP9z4cBftBAyTxtqgqsCqd__BLqcYKu6SGcsRB8ucDn9AGtCkPL8Dkyj9xm7KRaQ1cm8", + "type": "integer", + "value": 20000136473 + }, + { + "key": "%s%s%s__withdrawal__3P4rzwpBUxyLhpoG7CXmLnd3zTYSQ3FBWFA__Fm2qJTT6y1T8kpkxVJaXKQvrYkVc14gZqpNaX2QfZKTL", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4rzwpBUxyLhpoG7CXmLnd3zTYSQ3FBWFA__Fm2qJTT6y1T8kpkxVJaXKQvrYkVc14gZqpNaX2QfZKTL", + "type": "integer", + "value": 6224395586 + }, + { + "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__21zW2eB5Cchr9Jcvy1AkewDg3iNgecsB9MjzxjHQEdoQ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__21zW2eB5Cchr9Jcvy1AkewDg3iNgecsB9MjzxjHQEdoQ", + "type": "integer", + "value": 3992989593 + }, + { + "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__2SuXH9wxe8WqkMiLDPoqVcNRYwXHuGCLqbYVAwkn5HPT", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__2SuXH9wxe8WqkMiLDPoqVcNRYwXHuGCLqbYVAwkn5HPT", + "type": "integer", + "value": 1316690440 + }, + { + "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__6LyQj6ieZTYgMiYxWwcpyr3S515S1ZRZ8KzRbWG7ppfA", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__6LyQj6ieZTYgMiYxWwcpyr3S515S1ZRZ8KzRbWG7ppfA", + "type": "integer", + "value": 199166799 + }, + { + "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__9pZ6UX2s9qBtgHHQyageBWNUxwb8jwJ2yX9Fp33docNU", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__9pZ6UX2s9qBtgHHQyageBWNUxwb8jwJ2yX9Fp33docNU", + "type": "integer", + "value": 389344231 + }, + { + "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__EHm5bR2DgGeT9DNwPNw94iAjtmVVR44ryudxmwwvxebc", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__EHm5bR2DgGeT9DNwPNw94iAjtmVVR44ryudxmwwvxebc", + "type": "integer", + "value": 502543115 + }, + { + "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__8L3Er4amvWdoou2UJhz87sz6FGD7nwCC5vphJhQPChe2", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__8L3Er4amvWdoou2UJhz87sz6FGD7nwCC5vphJhQPChe2", + "type": "integer", + "value": 2944225000 + }, + { + "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__ESGj3Bu6yqyx4HeZhz5RM3WCtGyoueY2hbzKZVqZR6dU", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__ESGj3Bu6yqyx4HeZhz5RM3WCtGyoueY2hbzKZVqZR6dU", + "type": "integer", + "value": 13581425029 + }, + { + "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__Ehb9mKwL8Vu3cVDTEcU8QjNqjjQKDs8PbJds1fmjRKB9", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__Ehb9mKwL8Vu3cVDTEcU8QjNqjjQKDs8PbJds1fmjRKB9", + "type": "integer", + "value": 9782425053 + } + ] +} \ No newline at end of file diff --git a/migrations/withdrawals/factory_dataTx_1.json b/migrations/withdrawals/factory_dataTx_1.json new file mode 100644 index 0000000..41bd814 --- /dev/null +++ b/migrations/withdrawals/factory_dataTx_1.json @@ -0,0 +1,458 @@ +{ + "type": 12, + "version": 2, + "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", + "fee": 1500000, + "data": [ + { + "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__FBUTJbrTXpTpvJb27iDypdVB4rN9SpQQr9UutnVCfjMv", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__FBUTJbrTXpTpvJb27iDypdVB4rN9SpQQr9UutnVCfjMv", + "type": "integer", + "value": 9877400001 + }, + { + "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__2MEvJ686WYX7qYWyzrZda2VGj9EbaTMggophFm4Y3WgS", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__2MEvJ686WYX7qYWyzrZda2VGj9EbaTMggophFm4Y3WgS", + "type": "integer", + "value": 2500000000 + }, + { + "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__5U2kshgnejYtJNWfY434YA2fZ4E2dtszkxKuxuemztHF", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__5U2kshgnejYtJNWfY434YA2fZ4E2dtszkxKuxuemztHF", + "type": "integer", + "value": 2500000000 + }, + { + "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__5mMbqoSYxF9V2UDx5MJtm6hqsvjkmARY82RyVLFtykVE", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__5mMbqoSYxF9V2UDx5MJtm6hqsvjkmARY82RyVLFtykVE", + "type": "integer", + "value": 5000000000 + }, + { + "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__CSNkxEjsufhfFbCoBRkikAKjoFUtET2vgxagM13HzPmd", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__CSNkxEjsufhfFbCoBRkikAKjoFUtET2vgxagM13HzPmd", + "type": "integer", + "value": 10000000000 + }, + { + "key": "%s%s%s__withdrawal__3P5DW9p3EvAeRksHUAaGy9XSnByWA4Rmtac__EjpHmbEH5sSzPpThRNB5NjgLs5XgY76i3B6cZEHqr9FZ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5DW9p3EvAeRksHUAaGy9XSnByWA4Rmtac__EjpHmbEH5sSzPpThRNB5NjgLs5XgY76i3B6cZEHqr9FZ", + "type": "integer", + "value": 386691907 + }, + { + "key": "%s%s%s__withdrawal__3P5ExkWasVq9LuvhHnH4mihV1VQPtNWu21N__6fNuurew7EWHYRjCjQX333FqCKdYub7r5TBxbTPTDHtK", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5ExkWasVq9LuvhHnH4mihV1VQPtNWu21N__6fNuurew7EWHYRjCjQX333FqCKdYub7r5TBxbTPTDHtK", + "type": "integer", + "value": 1414477997 + }, + { + "key": "%s%s%s__withdrawal__3P5ExkWasVq9LuvhHnH4mihV1VQPtNWu21N__7SCTkCD42Tqnb6ukhwoUQecCZtGzGWeaSVYzYCeYgRgB", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5ExkWasVq9LuvhHnH4mihV1VQPtNWu21N__7SCTkCD42Tqnb6ukhwoUQecCZtGzGWeaSVYzYCeYgRgB", + "type": "integer", + "value": 79009686430 + }, + { + "key": "%s%s%s__withdrawal__3P5SLaCL3iF2FzrViwtPyuu2ZeoXTnZVExD__HHmLWxxGCDUvtTQzsF1Ndr5M7PSyHxdFmuToB8itdg7R", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5SLaCL3iF2FzrViwtPyuu2ZeoXTnZVExD__HHmLWxxGCDUvtTQzsF1Ndr5M7PSyHxdFmuToB8itdg7R", + "type": "integer", + "value": 10478125000 + }, + { + "key": "%s%s%s__withdrawal__3P5fDzDn5QnFFYJqwzkijVv2naN3PL9uHGv__2KLy91J2Rem5JyotF78NuwP7LB66WNibE7nHHYUqvrr1", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5fDzDn5QnFFYJqwzkijVv2naN3PL9uHGv__2KLy91J2Rem5JyotF78NuwP7LB66WNibE7nHHYUqvrr1", + "type": "integer", + "value": 84681407662 + }, + { + "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__2XxkkiecnXKuz3HAhpFF1ubwPZEhGo2d4HWDSss9zQpG", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__2XxkkiecnXKuz3HAhpFF1ubwPZEhGo2d4HWDSss9zQpG", + "type": "integer", + "value": 399237098 + }, + { + "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__4CgWn3kPZEuFHgDeQPdX7Kc9vuSMzhwpWDC7U9tyMcgj", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__4CgWn3kPZEuFHgDeQPdX7Kc9vuSMzhwpWDC7U9tyMcgj", + "type": "integer", + "value": 405708067 + }, + { + "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__5fnBRLgNwXMQwtUMQm2T5DfUp5UgqFu5MRVpzzdn59Q5", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__5fnBRLgNwXMQwtUMQm2T5DfUp5UgqFu5MRVpzzdn59Q5", + "type": "integer", + "value": 452133934 + }, + { + "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__5ptTeZ4udFP6CzTpQU55cVWWHc2bD3ZeMHDReSeKnoxy", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__5ptTeZ4udFP6CzTpQU55cVWWHc2bD3ZeMHDReSeKnoxy", + "type": "integer", + "value": 386438843 + }, + { + "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__8NHAnPJwrLEuhVkHwJgFJ4xVfvNwjubXAskAGNmA7Lf3", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__8NHAnPJwrLEuhVkHwJgFJ4xVfvNwjubXAskAGNmA7Lf3", + "type": "integer", + "value": 289800788 + }, + { + "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__BtmM6Czj887fLmaLkN3bzJvNwNxqVh9SdFVB8SEDNJQP", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__BtmM6Czj887fLmaLkN3bzJvNwNxqVh9SdFVB8SEDNJQP", + "type": "integer", + "value": 2044967239 + }, + { + "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__DoW38nhyb9QDPSqiojxAX1YfDG9Pew7VVBW5Ebgkg5im", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__DoW38nhyb9QDPSqiojxAX1YfDG9Pew7VVBW5Ebgkg5im", + "type": "integer", + "value": 799767551 + }, + { + "key": "%s%s%s__withdrawal__3P64FgRJU1EPEDMdTeSDyWMjDpGiRkBCLcH__9ZRPuw7fGq1tbdT1BrEMsE43Bhas5ffxxe1A4wcJYFi8", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64FgRJU1EPEDMdTeSDyWMjDpGiRkBCLcH__9ZRPuw7fGq1tbdT1BrEMsE43Bhas5ffxxe1A4wcJYFi8", + "type": "integer", + "value": 77729698612 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__27ufGrqNb3MJhQigzNBaF55kJS79L2e5KGNGmXrJRmra", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__27ufGrqNb3MJhQigzNBaF55kJS79L2e5KGNGmXrJRmra", + "type": "integer", + "value": 812529046 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__56fbD8GAoHQLJdcmb3NW1bhnqBUZBCoe9ckdRtqsAQmx", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__56fbD8GAoHQLJdcmb3NW1bhnqBUZBCoe9ckdRtqsAQmx", + "type": "integer", + "value": 887530143 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__5yVJByChonNrAGiqcjSogz3mLfWkKZ9sdsqba5PKTVbE", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__5yVJByChonNrAGiqcjSogz3mLfWkKZ9sdsqba5PKTVbE", + "type": "integer", + "value": 1625239283 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__7PP4v8Cga13AgTddSJSRPdTj5DrKcfx6YyigMRjkRedZ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__7PP4v8Cga13AgTddSJSRPdTj5DrKcfx6YyigMRjkRedZ", + "type": "integer", + "value": 891089016 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__7muns56cCpjbahT2xqL29MtLFSL8aWAgij7VnEQ4nXFo", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__7muns56cCpjbahT2xqL29MtLFSL8aWAgij7VnEQ4nXFo", + "type": "integer", + "value": 888735168 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__8DQtD3ah2f8R6ziTN77KcgKBrj5WHD7GCoyFXeTazPGj", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__8DQtD3ah2f8R6ziTN77KcgKBrj5WHD7GCoyFXeTazPGj", + "type": "integer", + "value": 835592997 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__AYvhQXdKs2wYp4SFR8jK5r29eHUUN6AAGzvg2yjnKH7f", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__AYvhQXdKs2wYp4SFR8jK5r29eHUUN6AAGzvg2yjnKH7f", + "type": "integer", + "value": 232087433 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__B9Tb8meLakqFy1e3a6UKp7nruLu8cHjuUVKVQGCNtKG8", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__B9Tb8meLakqFy1e3a6UKp7nruLu8cHjuUVKVQGCNtKG8", + "type": "integer", + "value": 870150724 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__BEJLjTHAuai8622RSkDMyk1eK58JxYiMUSd5FPHrwba6", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__BEJLjTHAuai8622RSkDMyk1eK58JxYiMUSd5FPHrwba6", + "type": "integer", + "value": 975432937 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__Big7gJnGgpgH6zcENjMsxMb5pNLKcyawjk9BtrdqQMjY", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__Big7gJnGgpgH6zcENjMsxMb5pNLKcyawjk9BtrdqQMjY", + "type": "integer", + "value": 949167159 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__BprQYizZ5uvVobULnVCpkfkLFXzrjwsEzsQLyRE8SHbg", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__BprQYizZ5uvVobULnVCpkfkLFXzrjwsEzsQLyRE8SHbg", + "type": "integer", + "value": 916865073 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__FbNRVDQN6ZPuvMoFQyv5DRE8hRPz9Vub4cRUeuuZcExB", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__FbNRVDQN6ZPuvMoFQyv5DRE8hRPz9Vub4cRUeuuZcExB", + "type": "integer", + "value": 904074418 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__GESy939vvVaiE8opgpbpkUofpw4VDnJUvzFnpzRfJXFh", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__GESy939vvVaiE8opgpbpkUofpw4VDnJUvzFnpzRfJXFh", + "type": "integer", + "value": 889330289 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__HGxVD8vNY1VobYyfntgwckYYSoDyA8xSnW43ZPvr6hRx", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__HGxVD8vNY1VobYyfntgwckYYSoDyA8xSnW43ZPvr6hRx", + "type": "integer", + "value": 1027092734 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__J4xA8ddnKrGBU6iYPuK2QcPT5jc9qX1izUsB1vojdJJd", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__J4xA8ddnKrGBU6iYPuK2QcPT5jc9qX1izUsB1vojdJJd", + "type": "integer", + "value": 951730963 + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__JnoWeweTGyCj3DoAKVi5aExrVoZbUqUyMYZp52Fn9Jw", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__JnoWeweTGyCj3DoAKVi5aExrVoZbUqUyMYZp52Fn9Jw", + "type": "integer", + "value": 1028620019 + }, + { + "key": "%s%s%s__withdrawal__3P6FjQcHZNggULXG8twvbjpsT1sBU8Sh2yv__HnPo6axXmi3eMDRBiq6bdkTXVxymMUW2dWPKHAHdMLom", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6FjQcHZNggULXG8twvbjpsT1sBU8Sh2yv__HnPo6axXmi3eMDRBiq6bdkTXVxymMUW2dWPKHAHdMLom", + "type": "integer", + "value": 505676149 + }, + { + "key": "%s%s%s__withdrawal__3P6Qdw4cuT9dvTHaHLRJ2iordKyMKJZqUg9__6kPAxnaGt3Gocd66E5bQXtrJdtXC4ohfC4azv2xwBaQR", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6Qdw4cuT9dvTHaHLRJ2iordKyMKJZqUg9__6kPAxnaGt3Gocd66E5bQXtrJdtXC4ohfC4azv2xwBaQR", + "type": "integer", + "value": 117647058 + }, + { + "key": "%s%s%s__withdrawal__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__8gpbhCu8HYNScTsYbvLjkAtedteXAUAAwSK8BxdBhAGY", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__8gpbhCu8HYNScTsYbvLjkAtedteXAUAAwSK8BxdBhAGY", + "type": "integer", + "value": 170142172 + }, + { + "key": "%s%s%s__withdrawal__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__9CZkDQLQ2vh3coEHHDdhCqBDQFEm3FW3GKr4TCQ8rhn7", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__9CZkDQLQ2vh3coEHHDdhCqBDQFEm3FW3GKr4TCQ8rhn7", + "type": "integer", + "value": 50000000 + }, + { + "key": "%s%s%s__withdrawal__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__HdRM9vxYaWQwB5hRLYGVSDbH9BQqwksWcKFAidTv5G2z", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__HdRM9vxYaWQwB5hRLYGVSDbH9BQqwksWcKFAidTv5G2z", + "type": "integer", + "value": 300000000 + }, + { + "key": "%s%s%s__withdrawal__3P6hUJtfEgFrRpdYgamDRKHqS6taW49REJ2__6vYZjU2j13VtxV62dQqNqs1CYCjvR9Z4iqGmvWJ2LrES", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6hUJtfEgFrRpdYgamDRKHqS6taW49REJ2__6vYZjU2j13VtxV62dQqNqs1CYCjvR9Z4iqGmvWJ2LrES", + "type": "integer", + "value": 50000000000 + }, + { + "key": "%s%s%s__withdrawal__3P6hUJtfEgFrRpdYgamDRKHqS6taW49REJ2__Dr6Wq5WvLdziMi2R1J2UX5umwG6fYoUN9z34dXw1iy6r", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6hUJtfEgFrRpdYgamDRKHqS6taW49REJ2__Dr6Wq5WvLdziMi2R1J2UX5umwG6fYoUN9z34dXw1iy6r", + "type": "integer", + "value": 61350477191 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__14MNmFNyk2t8KtUHLyk2m91DevYRARjbSZU3eKadrGep", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__14MNmFNyk2t8KtUHLyk2m91DevYRARjbSZU3eKadrGep", + "type": "integer", + "value": 11155060 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__2GQ1mJ5pZSEqUTCe7LgkQDZJFh2aHG45eYKVQHbebfsx", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__2GQ1mJ5pZSEqUTCe7LgkQDZJFh2aHG45eYKVQHbebfsx", + "type": "integer", + "value": 11607599 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__2NsKDKkrisvyN2T2ErCRz1LPGFEwkqWBg49tLDKa2YRT", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__2NsKDKkrisvyN2T2ErCRz1LPGFEwkqWBg49tLDKa2YRT", + "type": "integer", + "value": 44720723 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__32Ymhko3cgSembEJZPD5NYwqLYdkPoAJR74cvhctR1Ei", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__32Ymhko3cgSembEJZPD5NYwqLYdkPoAJR74cvhctR1Ei", + "type": "integer", + "value": 11052125 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__39ntEbBKDzgvNTSE7RDMwD3tgdbsERGcKZrJEbwZkZ94", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__39ntEbBKDzgvNTSE7RDMwD3tgdbsERGcKZrJEbwZkZ94", + "type": "integer", + "value": 11045845 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__3KnZFR3Huyz2uNM6nZ22ocWTt3eLAKhyS8kb8JeVRPNh", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__3KnZFR3Huyz2uNM6nZ22ocWTt3eLAKhyS8kb8JeVRPNh", + "type": "integer", + "value": 34312611 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__3wGpq8LHt97qzSkLHPUeuC9sqdaMgTU6rtvPVBoiivXd", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__3wGpq8LHt97qzSkLHPUeuC9sqdaMgTU6rtvPVBoiivXd", + "type": "integer", + "value": 21617215 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4AhEYv63DtEQyL48rtf4ahPSvvnTVT449ucxcJ9Sgfeh", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4AhEYv63DtEQyL48rtf4ahPSvvnTVT449ucxcJ9Sgfeh", + "type": "integer", + "value": 47434526 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4c4ZiETv5DL6HRDstaUCunJv71fHDhYZo8rEr2EFTL29", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4c4ZiETv5DL6HRDstaUCunJv71fHDhYZo8rEr2EFTL29", + "type": "integer", + "value": 54722187 + } + ] +} \ No newline at end of file diff --git a/migrations/withdrawals/factory_dataTx_2.json b/migrations/withdrawals/factory_dataTx_2.json new file mode 100644 index 0000000..3381fc4 --- /dev/null +++ b/migrations/withdrawals/factory_dataTx_2.json @@ -0,0 +1,458 @@ +{ + "type": 12, + "version": 2, + "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", + "fee": 1500000, + "data": [ + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4vzMaPsoiGFeMDdQaDyzwWFKwwtf5cJUqf3nG5SaytmZ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4vzMaPsoiGFeMDdQaDyzwWFKwwtf5cJUqf3nG5SaytmZ", + "type": "integer", + "value": 10550795 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6cw3qwauTRAKEdDZamDRTWAeaDSFsSMXbM6MANG5u9Qq", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6cw3qwauTRAKEdDZamDRTWAeaDSFsSMXbM6MANG5u9Qq", + "type": "integer", + "value": 20562038 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6uiY1Z5gqRp7FBn9YBgiKHAFdHg5DXe2on4spNUTFH3j", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6uiY1Z5gqRp7FBn9YBgiKHAFdHg5DXe2on4spNUTFH3j", + "type": "integer", + "value": 21822738 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6v7C9m3523e4JUNpfKimY9PorWwvL1xQ7HVw4THm48jE", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6v7C9m3523e4JUNpfKimY9PorWwvL1xQ7HVw4THm48jE", + "type": "integer", + "value": 10421827 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__77KcZwNsJPV6E73gasL8thDHon5dzwCiYnDnFPGG8Hgs", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__77KcZwNsJPV6E73gasL8thDHon5dzwCiYnDnFPGG8Hgs", + "type": "integer", + "value": 11830993 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__8rgoGNZ4wCHLfJUMPbRVuV81SUtAAauhqxWVB7VnEqD2", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__8rgoGNZ4wCHLfJUMPbRVuV81SUtAAauhqxWVB7VnEqD2", + "type": "integer", + "value": 31445997 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__92Hzny8dLCbs3TLR9sLB4ezWSkiqPLWtPGTEnph8xWq2", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__92Hzny8dLCbs3TLR9sLB4ezWSkiqPLWtPGTEnph8xWq2", + "type": "integer", + "value": 21383312 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__941zVpEYST1LgBfyT8YUbrZmfwtozkUNwsjV2R43NXz4", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__941zVpEYST1LgBfyT8YUbrZmfwtozkUNwsjV2R43NXz4", + "type": "integer", + "value": 132474262 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__AHBY2Zc6R1TgZHgJgiWZQxQQxPoR3Btn3XsFWdMoySfj", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__AHBY2Zc6R1TgZHgJgiWZQxQQxPoR3Btn3XsFWdMoySfj", + "type": "integer", + "value": 36556671 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__ATHVkJeA2YnRJbzm9hg9BMc8KZUMAXyQxjsyGL33pZSA", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__ATHVkJeA2YnRJbzm9hg9BMc8KZUMAXyQxjsyGL33pZSA", + "type": "integer", + "value": 55109731 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__AWca94muiRNn9ae2r1LSseyJjUXp7ohRiz1RJQF9HMAr", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__AWca94muiRNn9ae2r1LSseyJjUXp7ohRiz1RJQF9HMAr", + "type": "integer", + "value": 11956841 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__At2FQ1WJJfN4p6AjFLvTpkDSZC9g1zPuDW1y251AErWF", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__At2FQ1WJJfN4p6AjFLvTpkDSZC9g1zPuDW1y251AErWF", + "type": "integer", + "value": 44673206 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__B85FjvA7iWnFXx7qPX3c5MJmWmR1URixTaqfWmDQsWo7", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__B85FjvA7iWnFXx7qPX3c5MJmWmR1URixTaqfWmDQsWo7", + "type": "integer", + "value": 11585113 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__BMKBNv8WiZ5CqbZoUvZndxNmxMNQsxxeVjxedy7geuVs", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__BMKBNv8WiZ5CqbZoUvZndxNmxMNQsxxeVjxedy7geuVs", + "type": "integer", + "value": 9754716 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__BV4txM2dwUNqYFwF5nMgH2K62iZxoXAdp6fEBk4magv5", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__BV4txM2dwUNqYFwF5nMgH2K62iZxoXAdp6fEBk4magv5", + "type": "integer", + "value": 21146673 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__CA31WHmwpFEzQuPykdivdPuCcdThZX2BRstAXNZeybCQ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__CA31WHmwpFEzQuPykdivdPuCcdThZX2BRstAXNZeybCQ", + "type": "integer", + "value": 10882930 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__CYgbjMkMCK5YCGwnP7dpWkjaVKe8aWB4U7BNi9LG9YRT", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__CYgbjMkMCK5YCGwnP7dpWkjaVKe8aWB4U7BNi9LG9YRT", + "type": "integer", + "value": 31140432 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Cdq4qBLnViYKzsKhqyB47wADGnS45GYd63r7Ydg79n56", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Cdq4qBLnViYKzsKhqyB47wADGnS45GYd63r7Ydg79n56", + "type": "integer", + "value": 32511134 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Cneat15RX9p4WjzAvHqY3AQ1CFLUmmEr6CW76XHKBBwh", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Cneat15RX9p4WjzAvHqY3AQ1CFLUmmEr6CW76XHKBBwh", + "type": "integer", + "value": 66369995 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DJXt7fBgBgHt9YCrjFyJJCgx4kzWM4tAPu1oNwBomQZZ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DJXt7fBgBgHt9YCrjFyJJCgx4kzWM4tAPu1oNwBomQZZ", + "type": "integer", + "value": 21230274 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DXZCNwUeZkk7754bsyrmVMxjrUwsFicGxrkE8GdHcrv5", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DXZCNwUeZkk7754bsyrmVMxjrUwsFicGxrkE8GdHcrv5", + "type": "integer", + "value": 31585209 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DkrEHjfZRsiJ4MFKXLXi7ejkuV9YeLttehRgWGKJuPYx", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DkrEHjfZRsiJ4MFKXLXi7ejkuV9YeLttehRgWGKJuPYx", + "type": "integer", + "value": 32480652 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__E8HtDHKoVFWtMqTmGGCaDHiwyKnVQDB7dSbMo8Yqn7YU", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__E8HtDHKoVFWtMqTmGGCaDHiwyKnVQDB7dSbMo8Yqn7YU", + "type": "integer", + "value": 11015396 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__EYZvJcSrGw53UQ5U8h1sN1Qii3kqYMCoGs16gEKbdPPM", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__EYZvJcSrGw53UQ5U8h1sN1Qii3kqYMCoGs16gEKbdPPM", + "type": "integer", + "value": 10679925 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__EnPouN7N3qx8mrHKASvcTmwCBTZ9FnbNHi6GybYh48h9", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__EnPouN7N3qx8mrHKASvcTmwCBTZ9FnbNHi6GybYh48h9", + "type": "integer", + "value": 11421728 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Erorejb3kVNiehjmq8WcAmvzkr1VePZ5acc4wqsQsqRx", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Erorejb3kVNiehjmq8WcAmvzkr1VePZ5acc4wqsQsqRx", + "type": "integer", + "value": 10239135 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FAENNsNDm6qH79hfXWVMLStuqwAxuc9zrYuvyiCXc5TZ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FAENNsNDm6qH79hfXWVMLStuqwAxuc9zrYuvyiCXc5TZ", + "type": "integer", + "value": 10192005 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FFPDUF1XAGWkg5wt9PHbscwZ48ZrGFqYQMmWMxR57s3s", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FFPDUF1XAGWkg5wt9PHbscwZ48ZrGFqYQMmWMxR57s3s", + "type": "integer", + "value": 10943431 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FKWHB3Q1sQqG65exiD2VFiyFpkt9Hj2mJpmu1xGWuf1V", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FKWHB3Q1sQqG65exiD2VFiyFpkt9Hj2mJpmu1xGWuf1V", + "type": "integer", + "value": 33455112 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FREsEwm5EPC5TZDdE26Fup8Miey2D63HT5DLPBgf8U6y", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FREsEwm5EPC5TZDdE26Fup8Miey2D63HT5DLPBgf8U6y", + "type": "integer", + "value": 22434911 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FbuJGXB8pWKFc8sudqcfFgQRQFdJbW41ZaZ1vhsn848K", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FbuJGXB8pWKFc8sudqcfFgQRQFdJbW41ZaZ1vhsn848K", + "type": "integer", + "value": 22737478 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__GdJrY7AHfc5n6c46fa5gmhP4v8jq7LuVrSuw9njq1pST", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__GdJrY7AHfc5n6c46fa5gmhP4v8jq7LuVrSuw9njq1pST", + "type": "integer", + "value": 22299930 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Gs1xvTKNRwtoHHPhFxze1VkbTj5bWWPoU8G4bpe25eWr", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Gs1xvTKNRwtoHHPhFxze1VkbTj5bWWPoU8G4bpe25eWr", + "type": "integer", + "value": 15842779 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__GzePPYLLxpmc3DEu7sixWi1qxR5fQERrsewcAqwEjt5L", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__GzePPYLLxpmc3DEu7sixWi1qxR5fQERrsewcAqwEjt5L", + "type": "integer", + "value": 12307197 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Hyiz1vqr1XQcBcECFPAagHszFoSSn1YeC6VbzKZBHG8U", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Hyiz1vqr1XQcBcECFPAagHszFoSSn1YeC6VbzKZBHG8U", + "type": "integer", + "value": 26720291 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__J8i5eX95KhxbYoH6Mrq69eBmafwQsuFDMNU26u5fGyui", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__J8i5eX95KhxbYoH6Mrq69eBmafwQsuFDMNU26u5fGyui", + "type": "integer", + "value": 11568077 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__vT6ohBw6F6teDKpcPobXrgKbgChbkKUVw37sxma7rnH", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__vT6ohBw6F6teDKpcPobXrgKbgChbkKUVw37sxma7rnH", + "type": "integer", + "value": 44845253 + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__xz1TtVTA16Y4JvgPuSW94vqytyecMvT8XWyoMadWi33", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__xz1TtVTA16Y4JvgPuSW94vqytyecMvT8XWyoMadWi33", + "type": "integer", + "value": 32532051 + }, + { + "key": "%s%s%s__withdrawal__3P6waUhBFADThmgZ9r9ouCrrBG2bUGjdDbU__DBFAumkaXvAFyi3RsVbV1UfkaRFkobCzRtuTgkRPKNsC", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6waUhBFADThmgZ9r9ouCrrBG2bUGjdDbU__DBFAumkaXvAFyi3RsVbV1UfkaRFkobCzRtuTgkRPKNsC", + "type": "integer", + "value": 110138935 + }, + { + "key": "%s%s%s__withdrawal__3P6waUhBFADThmgZ9r9ouCrrBG2bUGjdDbU__FSgYRp45BGE4jBtdgAFFgHXqnGnNvucBSbpwk3Gs5v71", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6waUhBFADThmgZ9r9ouCrrBG2bUGjdDbU__FSgYRp45BGE4jBtdgAFFgHXqnGnNvucBSbpwk3Gs5v71", + "type": "integer", + "value": 2651628247 + }, + { + "key": "%s%s%s__withdrawal__3P7LBLiPjMKP1jeRXnp1LvW5dwMTU3AtyBF__BtGFmASgvxCqKRZoA9eHCkxNJu6vjPRAJHbyH8dWcP4b", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P7LBLiPjMKP1jeRXnp1LvW5dwMTU3AtyBF__BtGFmASgvxCqKRZoA9eHCkxNJu6vjPRAJHbyH8dWcP4b", + "type": "integer", + "value": 13066160366 + }, + { + "key": "%s%s%s__withdrawal__3P7X9caDLcngjaAqCjwQjzkgMuVoTKNav72__AKuQopJtmx7etmQTv1a8SCnb6PbXNysHGCpWbWGYoq36", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P7X9caDLcngjaAqCjwQjzkgMuVoTKNav72__AKuQopJtmx7etmQTv1a8SCnb6PbXNysHGCpWbWGYoq36", + "type": "integer", + "value": 94984 + }, + { + "key": "%s%s%s__withdrawal__3P7mqPfcMt4GeBE1U8gF9jgpCT9T85fSK4f__7pyUvTQWYjxQVJDMeVThCeouMHTTKhq4bBZU5RRJR7bL", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P7mqPfcMt4GeBE1U8gF9jgpCT9T85fSK4f__7pyUvTQWYjxQVJDMeVThCeouMHTTKhq4bBZU5RRJR7bL", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s%s__withdrawal__3P83kwB2C5GmH7D1z1cwdjDMLvF4FZyhxZf__GcKq28ZCMrGqS5k29QEFpGxbwLssuUKQk8ydGQmqrLaH", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P83kwB2C5GmH7D1z1cwdjDMLvF4FZyhxZf__GcKq28ZCMrGqS5k29QEFpGxbwLssuUKQk8ydGQmqrLaH", + "type": "integer", + "value": 14535961556 + }, + { + "key": "%s%s%s__withdrawal__3P8bxPavni6rQjNXWFnP6Xw68Bb8gyAB3pb__AbhrfsEnNPKNNfd4UK7Vapi5Hu87HiJmuHYnSHcQZa1E", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P8bxPavni6rQjNXWFnP6Xw68Bb8gyAB3pb__AbhrfsEnNPKNNfd4UK7Vapi5Hu87HiJmuHYnSHcQZa1E", + "type": "integer", + "value": 200576587496 + }, + { + "key": "%s%s%s__withdrawal__3P8hEMtF3exJMnDSBUcAYF1mcCZg421nM8h__9EJnwzhRVjS7uysxeWkkSVYDVvpTk9AA9uGNg1jeQEk2", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P8hEMtF3exJMnDSBUcAYF1mcCZg421nM8h__9EJnwzhRVjS7uysxeWkkSVYDVvpTk9AA9uGNg1jeQEk2", + "type": "integer", + "value": 2849250000 + }, + { + "key": "%s%s%s__withdrawal__3P8hEMtF3exJMnDSBUcAYF1mcCZg421nM8h__AuLEZj1gAL8b1F6G6sYmL7oV6SMtY9LbQota5ytctrXZ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P8hEMtF3exJMnDSBUcAYF1mcCZg421nM8h__AuLEZj1gAL8b1F6G6sYmL7oV6SMtY9LbQota5ytctrXZ", + "type": "integer", + "value": 7598000000 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__14k6HsyPZFyxdqrM7BUcaxKYzTp7ViaMemcMDzZLGhed", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__14k6HsyPZFyxdqrM7BUcaxKYzTp7ViaMemcMDzZLGhed", + "type": "integer", + "value": 545743672 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__2LbVFLoUhdppZpgUwy9MJ3ZMAtqHK7CsUd3To987xuFR", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__2LbVFLoUhdppZpgUwy9MJ3ZMAtqHK7CsUd3To987xuFR", + "type": "integer", + "value": 617266276 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__3ATn6AGyCf5kh8dYPe3rgDLkbatAeCaK32rSZGb9Yw8N", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__3ATn6AGyCf5kh8dYPe3rgDLkbatAeCaK32rSZGb9Yw8N", + "type": "integer", + "value": 614580696 + } + ] +} \ No newline at end of file diff --git a/migrations/withdrawals/factory_dataTx_3.json b/migrations/withdrawals/factory_dataTx_3.json new file mode 100644 index 0000000..011331a --- /dev/null +++ b/migrations/withdrawals/factory_dataTx_3.json @@ -0,0 +1,458 @@ +{ + "type": 12, + "version": 2, + "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", + "fee": 1500000, + "data": [ + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__4hfg1R9waj1cAfEi6eRJPPvravNPCwA9G199SsS5qzwu", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__4hfg1R9waj1cAfEi6eRJPPvravNPCwA9G199SsS5qzwu", + "type": "integer", + "value": 1028778611 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__6Cmf6GdFMdj7AAuDxgKvG27XTgqZULGhqL43TyFDMpTX", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__6Cmf6GdFMdj7AAuDxgKvG27XTgqZULGhqL43TyFDMpTX", + "type": "integer", + "value": 599590253 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__6QN2kXp4tvvTqP4JvUFygnmEWtKUkNnzfYVBKKXBuotT", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__6QN2kXp4tvvTqP4JvUFygnmEWtKUkNnzfYVBKKXBuotT", + "type": "integer", + "value": 560637495 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__7eHuVPzsHNwxApvoSNAQKZChnSfLimYEHePGxanQKuLd", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__7eHuVPzsHNwxApvoSNAQKZChnSfLimYEHePGxanQKuLd", + "type": "integer", + "value": 146163206 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__9EgrGotLuM1Y32r5vp6EWKG5XCNNhvM8EG376J9TG83y", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__9EgrGotLuM1Y32r5vp6EWKG5XCNNhvM8EG376J9TG83y", + "type": "integer", + "value": 579915894 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__ACRqSLFin8iJCK9Qw7KK3zKqb1EPm2UDB4pjgxe3wNzo", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__ACRqSLFin8iJCK9Qw7KK3zKqb1EPm2UDB4pjgxe3wNzo", + "type": "integer", + "value": 580103147 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BDcbyemFLsjUuRFCMUAqwE7xGC7LaM879e6Gn9Npufyw", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BDcbyemFLsjUuRFCMUAqwE7xGC7LaM879e6Gn9Npufyw", + "type": "integer", + "value": 658998488 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BV2WxGM3pKyZEttzGttTNP2dbTnJSF7T2L5pXCZoDG6g", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BV2WxGM3pKyZEttzGttTNP2dbTnJSF7T2L5pXCZoDG6g", + "type": "integer", + "value": 637796002 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BeKUdUbavZxd1AtsvCMCEARDxPYHGS8Qz3XjSsq3umQ4", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BeKUdUbavZxd1AtsvCMCEARDxPYHGS8Qz3XjSsq3umQ4", + "type": "integer", + "value": 609803464 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__CbV1yHxfd6Ph9H4pHzFkFn71J5VFdhxjNaSuWYiRZmpA", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__CbV1yHxfd6Ph9H4pHzFkFn71J5VFdhxjNaSuWYiRZmpA", + "type": "integer", + "value": 569210696 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__E8NRAF2Rur5f8SbxVBRpdEDioMANTxwuuKvLKD9WP2CN", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__E8NRAF2Rur5f8SbxVBRpdEDioMANTxwuuKvLKD9WP2CN", + "type": "integer", + "value": 590049936 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__Gg3imMpwEf1LcR14hpeBXBEAsNiznVLpKJu85HfqcsZs", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__Gg3imMpwEf1LcR14hpeBXBEAsNiznVLpKJu85HfqcsZs", + "type": "integer", + "value": 597180780 + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__GxMdqYaQDJp9exxvHzGoVXATu8jjzZjaPvqC5W112FkA", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__GxMdqYaQDJp9exxvHzGoVXATu8jjzZjaPvqC5W112FkA", + "type": "integer", + "value": 568871116 + }, + { + "key": "%s%s%s__withdrawal__3PA65ZA2Cgu9jPJA3jS1Z4jxpZspxYAhevJ__2nL63FSg5rS7iZtwevPaM5q5zEhDAXA2XhmVTywxv2EJ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PA65ZA2Cgu9jPJA3jS1Z4jxpZspxYAhevJ__2nL63FSg5rS7iZtwevPaM5q5zEhDAXA2XhmVTywxv2EJ", + "type": "integer", + "value": 575712232118 + }, + { + "key": "%s%s%s__withdrawal__3PA65ZA2Cgu9jPJA3jS1Z4jxpZspxYAhevJ__DHccWbLzSVZSEmsnQRB1QvLKSs9cMM1xdoRpDatPTdqJ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PA65ZA2Cgu9jPJA3jS1Z4jxpZspxYAhevJ__DHccWbLzSVZSEmsnQRB1QvLKSs9cMM1xdoRpDatPTdqJ", + "type": "integer", + "value": 239494425 + }, + { + "key": "%s%s%s__withdrawal__3PAeLTZwJtvRWweZM4M9Jt2V4dVtTpXBCEK__8mjBv5gMedtUSCFnGVecBksdTkPckoDghHAeLsDC9SvF", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PAeLTZwJtvRWweZM4M9Jt2V4dVtTpXBCEK__8mjBv5gMedtUSCFnGVecBksdTkPckoDghHAeLsDC9SvF", + "type": "integer", + "value": 4514259699 + }, + { + "key": "%s%s%s__withdrawal__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__2KEK7eXFWHMBL4nJgh2SndecdG57aFdGDPGbBc4ACNGM", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__2KEK7eXFWHMBL4nJgh2SndecdG57aFdGDPGbBc4ACNGM", + "type": "integer", + "value": 2469350000 + }, + { + "key": "%s%s%s__withdrawal__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__8wkThDGqFhWVuAtbNGQQPhJHPfKj8h1iiR6Kgu5HCryg", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__8wkThDGqFhWVuAtbNGQQPhJHPfKj8h1iiR6Kgu5HCryg", + "type": "integer", + "value": 33204150000 + }, + { + "key": "%s%s%s__withdrawal__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__J8oh5hmM2U7B5Pwzjq4NLLpdN5BgmpVEBizKgTUesbBx", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__J8oh5hmM2U7B5Pwzjq4NLLpdN5BgmpVEBizKgTUesbBx", + "type": "integer", + "value": 9877400000 + }, + { + "key": "%s%s%s__withdrawal__3PAuU9oc5YmkoHnb4KQMCkxn9ebsykynBCH__3y7ki2i4hvmw675QPH7pG5m5dWoZUcDGvoaRizX67PRH", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PAuU9oc5YmkoHnb4KQMCkxn9ebsykynBCH__3y7ki2i4hvmw675QPH7pG5m5dWoZUcDGvoaRizX67PRH", + "type": "integer", + "value": 10000000000 + }, + { + "key": "%s%s%s__withdrawal__3PBVqECkRHz87gJRZpn7oyhFWjZF9vcDcsR__FNAp4dQfrcdRq4fCeQTwgRJbo8xrLarva9HPZttwmTVB", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PBVqECkRHz87gJRZpn7oyhFWjZF9vcDcsR__FNAp4dQfrcdRq4fCeQTwgRJbo8xrLarva9HPZttwmTVB", + "type": "integer", + "value": 90000000 + }, + { + "key": "%s%s%s__withdrawal__3PBbYtxa4fW8GM5xpqqCP4jyZmCwsNFoe5P__GZMEGN138VLKKzbijnx9HjpVvXCuj28xqVa6JFvpHqms", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PBbYtxa4fW8GM5xpqqCP4jyZmCwsNFoe5P__GZMEGN138VLKKzbijnx9HjpVvXCuj28xqVa6JFvpHqms", + "type": "integer", + "value": 6215937909 + }, + { + "key": "%s%s%s__withdrawal__3PBitcoinAVGJvpSe6jevepPbT3M8SoMZjb__D4sr8JiTHeMZ1dgvc4ubG8U26Vf7sQ3d6x7LuVEawDFY", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PBitcoinAVGJvpSe6jevepPbT3M8SoMZjb__D4sr8JiTHeMZ1dgvc4ubG8U26Vf7sQ3d6x7LuVEawDFY", + "type": "integer", + "value": 4159587500 + }, + { + "key": "%s%s%s__withdrawal__3PCLkgzwEY71DDLtkPYAs1gsbbJoqmiqn62__2waf3wGnXM8h7fEJ9iWS5mcczeLj6e6gDWRA8ZALN7mC", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PCLkgzwEY71DDLtkPYAs1gsbbJoqmiqn62__2waf3wGnXM8h7fEJ9iWS5mcczeLj6e6gDWRA8ZALN7mC", + "type": "integer", + "value": 11621912872 + }, + { + "key": "%s%s%s__withdrawal__3PCLkgzwEY71DDLtkPYAs1gsbbJoqmiqn62__4BMq52B44fjuFLR2GXrmmY8F7FnqXE3HCaF2Vx8EUrMh", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PCLkgzwEY71DDLtkPYAs1gsbbJoqmiqn62__4BMq52B44fjuFLR2GXrmmY8F7FnqXE3HCaF2Vx8EUrMh", + "type": "integer", + "value": 2817361866 + }, + { + "key": "%s%s%s__withdrawal__3PCQiEJsERrUyrVV2551MNs4eSDAhgQg5e4__4YRqUYuVZaBNPi9ekTHaVWgpox72qmUZk9bRq41WL7u7", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PCQiEJsERrUyrVV2551MNs4eSDAhgQg5e4__4YRqUYuVZaBNPi9ekTHaVWgpox72qmUZk9bRq41WL7u7", + "type": "integer", + "value": 2647861143 + }, + { + "key": "%s%s%s__withdrawal__3PCRRYmirzTXmLZ9R2peoxYD4AugayNAizG__3KHFpr16VcnwNvs1E5ygi1pgEmdqQw17bwkeCDosQow4", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PCRRYmirzTXmLZ9R2peoxYD4AugayNAizG__3KHFpr16VcnwNvs1E5ygi1pgEmdqQw17bwkeCDosQow4", + "type": "integer", + "value": 683944419 + }, + { + "key": "%s%s%s__withdrawal__3PCRRYmirzTXmLZ9R2peoxYD4AugayNAizG__D9JX8EZ6gJiEei1FD5BvKihbfctDEWDvmvZ4KqAsR39A", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PCRRYmirzTXmLZ9R2peoxYD4AugayNAizG__D9JX8EZ6gJiEei1FD5BvKihbfctDEWDvmvZ4KqAsR39A", + "type": "integer", + "value": 616679837 + }, + { + "key": "%s%s%s__withdrawal__3PCoDJZ4R95qFdiAwdhjf9y2jtTiskJ9STo__9BfbSk8Eo9tA5rdgyJ6RYKDhyrGqZktvX5ngfbSF7oqs", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PCoDJZ4R95qFdiAwdhjf9y2jtTiskJ9STo__9BfbSk8Eo9tA5rdgyJ6RYKDhyrGqZktvX5ngfbSF7oqs", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__4S8g9z2F5PVRxmtgcbdqmg6izegibcatZnfqT2VniJFM", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__4S8g9z2F5PVRxmtgcbdqmg6izegibcatZnfqT2VniJFM", + "type": "integer", + "value": 135679809 + }, + { + "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__8Y66uDT4Rh68nCaU3WP2nsou6aMKDeBzJLWxqmjUsSbh", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__8Y66uDT4Rh68nCaU3WP2nsou6aMKDeBzJLWxqmjUsSbh", + "type": "integer", + "value": 100305841227 + }, + { + "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__Abybzx4zoTJfPBhN1m3wasqDBoAzhcMpQHz4fHPAgCEM", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__Abybzx4zoTJfPBhN1m3wasqDBoAzhcMpQHz4fHPAgCEM", + "type": "integer", + "value": 241963368500 + }, + { + "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__C27WZcwp3pxELD2Ejf3io8MyTKbbaDEi1vLMWoFVAUuc", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__C27WZcwp3pxELD2Ejf3io8MyTKbbaDEi1vLMWoFVAUuc", + "type": "integer", + "value": 5655047 + }, + { + "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__D4y1MHEJcjs1DAjGr1JfsYrn5SRP9f9uCr7RE8khJ6Z2", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__D4y1MHEJcjs1DAjGr1JfsYrn5SRP9f9uCr7RE8khJ6Z2", + "type": "integer", + "value": 317319860034 + }, + { + "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__GJhJWKZMRqbxq1J4eaz4WW2ua7qqh1FhDRuGxo7kRcH", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__GJhJWKZMRqbxq1J4eaz4WW2ua7qqh1FhDRuGxo7kRcH", + "type": "integer", + "value": 1413740 + }, + { + "key": "%s%s%s__withdrawal__3PCwtPsA4s2fyZrYs8A9QS2SgUr1Xe9qriV__AVeQzWSiEN7kGx23ycUg6rX4LdMZGDuLkY4rMrEsgHUr", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PCwtPsA4s2fyZrYs8A9QS2SgUr1Xe9qriV__AVeQzWSiEN7kGx23ycUg6rX4LdMZGDuLkY4rMrEsgHUr", + "type": "integer", + "value": 86870275 + }, + { + "key": "%s%s%s__withdrawal__3PCyijL9g2TTJ5uJogVW2sdgMjPoRH7xNZX__5stqqR15Ka98hKBE8gmV1SUkrFJc1RRRK9mPH7CHsV4m", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PCyijL9g2TTJ5uJogVW2sdgMjPoRH7xNZX__5stqqR15Ka98hKBE8gmV1SUkrFJc1RRRK9mPH7CHsV4m", + "type": "integer", + "value": 256014683952 + }, + { + "key": "%s%s%s__withdrawal__3PDMAiABRewTdMeNnGuVC3mWG7tQVuBWzYn__3cczdjKSoAY545hpRCJMZE6cBE9ZXgnMR7v6328rk7Fe", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PDMAiABRewTdMeNnGuVC3mWG7tQVuBWzYn__3cczdjKSoAY545hpRCJMZE6cBE9ZXgnMR7v6328rk7Fe", + "type": "integer", + "value": 4125527466 + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__4ZrPeEdaCcXzs1aZbZwHcFDR2zggEPwPgRodhbjNS2Va", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__4ZrPeEdaCcXzs1aZbZwHcFDR2zggEPwPgRodhbjNS2Va", + "type": "integer", + "value": 1980251476 + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__9Ze41pWqASikNqK8RFubn9BWqxYWSTBqyehfak2EFvNL", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__9Ze41pWqASikNqK8RFubn9BWqxYWSTBqyehfak2EFvNL", + "type": "integer", + "value": 1000000000 + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__C2YYEP7Ps8TiCrAgPZNJZJzYJLJSyi8CEExxVWRTcGkB", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__C2YYEP7Ps8TiCrAgPZNJZJzYJLJSyi8CEExxVWRTcGkB", + "type": "integer", + "value": 1582817293 + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__DJ5UzyYyqC8RQfWom26X8Qmn89Sb973Q9EmFpQkhvbsc", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__DJ5UzyYyqC8RQfWom26X8Qmn89Sb973Q9EmFpQkhvbsc", + "type": "integer", + "value": 289722509 + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__EH98Fiaw6ZyTFogRBBUupuNhcGP5vgrGbE5ZRPR4KKWH", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__EH98Fiaw6ZyTFogRBBUupuNhcGP5vgrGbE5ZRPR4KKWH", + "type": "integer", + "value": 6427446837 + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__EHvc7Q343pBwRgC9q7q3VoGuag2n4sHgkBzycoZY2cfj", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__EHvc7Q343pBwRgC9q7q3VoGuag2n4sHgkBzycoZY2cfj", + "type": "integer", + "value": 665445343 + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__Gza8TnPt4kKST5jCn3LLG3SdL8KDjTxmhHpfWVy7t6f7", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__Gza8TnPt4kKST5jCn3LLG3SdL8KDjTxmhHpfWVy7t6f7", + "type": "integer", + "value": 1500000000 + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__HFf32TnGQUXEhX2VxebBiiwT4ZTkEwhaksGKnZAsHMdc", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__HFf32TnGQUXEhX2VxebBiiwT4ZTkEwhaksGKnZAsHMdc", + "type": "integer", + "value": 1000000000 + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__Hj3d2nM1FYRCViPnRpPN76VWDgSoh2YueWjZ7soi1iys", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__Hj3d2nM1FYRCViPnRpPN76VWDgSoh2YueWjZ7soi1iys", + "type": "integer", + "value": 2107514993 + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__ak4a7Gba2S2WN27ddWkXJa8HzaKtiojiX8rqeVBDpto", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__ak4a7Gba2S2WN27ddWkXJa8HzaKtiojiX8rqeVBDpto", + "type": "integer", + "value": 3000000000 + }, + { + "key": "%s%s%s__withdrawal__3PDRLD37a7qwABsxiKgfpJeqUt5CuSjetLL__HPMkfvfLYwy95G2uSyc1AQSdq6eC1bxBbbgzC3JDevSv", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PDRLD37a7qwABsxiKgfpJeqUt5CuSjetLL__HPMkfvfLYwy95G2uSyc1AQSdq6eC1bxBbbgzC3JDevSv", + "type": "integer", + "value": 8668503954 + }, + { + "key": "%s%s%s__withdrawal__3PDdkNJqhKGJNTHdqJbJrtKgQsoCgDHhMoZ__7j9fzhwDCR15DmzPCxLYRUBo8NyLDdQsF4PwKRSDNXfi", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PDdkNJqhKGJNTHdqJbJrtKgQsoCgDHhMoZ__7j9fzhwDCR15DmzPCxLYRUBo8NyLDdQsF4PwKRSDNXfi", + "type": "integer", + "value": 202048988016 + } + ] +} \ No newline at end of file diff --git a/migrations/withdrawals/factory_dataTx_4.json b/migrations/withdrawals/factory_dataTx_4.json new file mode 100644 index 0000000..fc35864 --- /dev/null +++ b/migrations/withdrawals/factory_dataTx_4.json @@ -0,0 +1,458 @@ +{ + "type": 12, + "version": 2, + "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", + "fee": 1500000, + "data": [ + { + "key": "%s%s%s__withdrawal__3PDyGuhrKsitcBJHJg1fviJQ4NoFFm3AR3j__13zpZkbR9BphAjNYLBrFhS8JjpFLcNcZq7jnDrDQeSSc", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PDyGuhrKsitcBJHJg1fviJQ4NoFFm3AR3j__13zpZkbR9BphAjNYLBrFhS8JjpFLcNcZq7jnDrDQeSSc", + "type": "integer", + "value": 5498421 + }, + { + "key": "%s%s%s__withdrawal__3PE6zfGg6yYimCXnNZzNZcCvuzRM719PGwm__4EkYEvEcN9VcNMybZyBvguS6VvezrFCCkWPFswEjMTyR", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PE6zfGg6yYimCXnNZzNZcCvuzRM719PGwm__4EkYEvEcN9VcNMybZyBvguS6VvezrFCCkWPFswEjMTyR", + "type": "integer", + "value": 134808490 + }, + { + "key": "%s%s%s__withdrawal__3PEM8TcwGMAmpSLA4tUkNRD1bsP7a62aAMS__2zMfat2vvXzUmirwoWhrLc1fCyh5irNtu98HbZsUzX3Q", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PEM8TcwGMAmpSLA4tUkNRD1bsP7a62aAMS__2zMfat2vvXzUmirwoWhrLc1fCyh5irNtu98HbZsUzX3Q", + "type": "integer", + "value": 3600000000 + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__2ZkpVAX7ysR429RuQZY7SFjepidyMwmLvvTfvFXRWCsQ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__2ZkpVAX7ysR429RuQZY7SFjepidyMwmLvvTfvFXRWCsQ", + "type": "integer", + "value": 119374108 + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__6ugq8QJRNCVa2vqR7mJqJyQmDFfz81CDQ91vQ4GmsAtE", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__6ugq8QJRNCVa2vqR7mJqJyQmDFfz81CDQ91vQ4GmsAtE", + "type": "integer", + "value": 101620720 + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__Bd6fU5Fg4P7gubju9n9y6ACMyypUprcteTFG4Kxq7nyJ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__Bd6fU5Fg4P7gubju9n9y6ACMyypUprcteTFG4Kxq7nyJ", + "type": "integer", + "value": 122677482 + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__BmJ9thNrMFKFwrp1W1tfcTWa4bsRUt2KpXgPgMuBL243", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__BmJ9thNrMFKFwrp1W1tfcTWa4bsRUt2KpXgPgMuBL243", + "type": "integer", + "value": 111226036 + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__E3ffqUgHVotYp3HcrrXpiDpSFPWrBpmqw8miNg2nbzBQ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__E3ffqUgHVotYp3HcrrXpiDpSFPWrBpmqw8miNg2nbzBQ", + "type": "integer", + "value": 111708069 + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__EUJtrBxYzJGP515pnusTccY3J4arifdvpN6NLJPfPBBG", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__EUJtrBxYzJGP515pnusTccY3J4arifdvpN6NLJPfPBBG", + "type": "integer", + "value": 314031850 + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__GAkPWdf1mPCBBAMHt5db9fKeTspeZzKRPAxyzhxTj1aY", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__GAkPWdf1mPCBBAMHt5db9fKeTspeZzKRPAxyzhxTj1aY", + "type": "integer", + "value": 105090202 + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__HC9jRsRT5JSdVLgQjPY3CWT11qTjEsWxFQ6aCnniK5Ze", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__HC9jRsRT5JSdVLgQjPY3CWT11qTjEsWxFQ6aCnniK5Ze", + "type": "integer", + "value": 451928553 + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__Hph1x3qXsst2ysXko9Mecq1qhB6WvaSrSb4VmBaAYQrk", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__Hph1x3qXsst2ysXko9Mecq1qhB6WvaSrSb4VmBaAYQrk", + "type": "integer", + "value": 265607223 + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__HsqjcoHQzUtSC6Nf3WsW4fD8G5HsurTs6mwGJxNS1AzC", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__HsqjcoHQzUtSC6Nf3WsW4fD8G5HsurTs6mwGJxNS1AzC", + "type": "integer", + "value": 81391103 + }, + { + "key": "%s%s%s__withdrawal__3PEbmcoRgzuf6W67XFqn6rm9PKU744H8PGG__AWZjFnDT9hJDPUwsvf3azouBZ1ipJymNMfTNJRtwGjpB", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PEbmcoRgzuf6W67XFqn6rm9PKU744H8PGG__AWZjFnDT9hJDPUwsvf3azouBZ1ipJymNMfTNJRtwGjpB", + "type": "integer", + "value": 58558547 + }, + { + "key": "%s%s%s__withdrawal__3PEbpUKHrLw4y5uLie6QEtsAS74TC5CRMLb__E5LBHGLTGgVc5hj8TviwwebHjjE9LCv6unw7QXkRJwao", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PEbpUKHrLw4y5uLie6QEtsAS74TC5CRMLb__E5LBHGLTGgVc5hj8TviwwebHjjE9LCv6unw7QXkRJwao", + "type": "integer", + "value": 2528864617 + }, + { + "key": "%s%s%s__withdrawal__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__CXhPZTuuWrv4SYAXnUSDGXgQd4Rjt28e32GVgn9SUg1n", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__CXhPZTuuWrv4SYAXnUSDGXgQd4Rjt28e32GVgn9SUg1n", + "type": "integer", + "value": 3743476274 + }, + { + "key": "%s%s%s__withdrawal__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__DkceM4tfugUJ9HVVYwtt9VyvKhTAm1YVYSivMZTViKAE", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__DkceM4tfugUJ9HVVYwtt9VyvKhTAm1YVYSivMZTViKAE", + "type": "integer", + "value": 41878551773 + }, + { + "key": "%s%s%s__withdrawal__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__GzDQVuTc8sG2g6CRGCzTNus9kWujuGf3kYViYG9z98k", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__GzDQVuTc8sG2g6CRGCzTNus9kWujuGf3kYViYG9z98k", + "type": "integer", + "value": 9366361994 + }, + { + "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__26cjFAYWH8Y24P5QN3JmCboRHwGCB1dNjWHZDsSTrUDr", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__26cjFAYWH8Y24P5QN3JmCboRHwGCB1dNjWHZDsSTrUDr", + "type": "integer", + "value": 532785065 + }, + { + "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__4jzbvZVYeGyAfv76RNmXUky1To35Wr3BfCKsksaxoRBU", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__4jzbvZVYeGyAfv76RNmXUky1To35Wr3BfCKsksaxoRBU", + "type": "integer", + "value": 675671991 + }, + { + "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__7RMh7WmnsDa1JcGTuCz6JWjzp9t1sGW4uSqNdEY6yyQo", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__7RMh7WmnsDa1JcGTuCz6JWjzp9t1sGW4uSqNdEY6yyQo", + "type": "integer", + "value": 584077704 + }, + { + "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__BQ5EWuQMfwM2NB5pEoKtGhaSPQCvbXv6h3fpLpdDmDd8", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__BQ5EWuQMfwM2NB5pEoKtGhaSPQCvbXv6h3fpLpdDmDd8", + "type": "integer", + "value": 1114711917 + }, + { + "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__Bt5sDSNhd6A7WkS4jYRZieJQiguYSme9edhrna54gKc8", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__Bt5sDSNhd6A7WkS4jYRZieJQiguYSme9edhrna54gKc8", + "type": "integer", + "value": 718465948 + }, + { + "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__Fpdr8dFVNc7DRGFgG7dc2CkdMSBXFM381YPP4fiWrxrj", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__Fpdr8dFVNc7DRGFgG7dc2CkdMSBXFM381YPP4fiWrxrj", + "type": "integer", + "value": 445181522 + }, + { + "key": "%s%s%s__withdrawal__3PF2RKwvJ4Cq45mEtSbG7trbU3yJ2ynZfVu__AejckCY2gxT1o7TnuQ7cFW2mqKQgqzFmKXgpzMG7GKc", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PF2RKwvJ4Cq45mEtSbG7trbU3yJ2ynZfVu__AejckCY2gxT1o7TnuQ7cFW2mqKQgqzFmKXgpzMG7GKc", + "type": "integer", + "value": 983457060 + }, + { + "key": "%s%s%s__withdrawal__3PF6HUACCxujjSbdxtUzPuwbQUjXQd4eqF2__DGm1La5bR2Mpo1skkcxXyWErDSKQRUZwLvk8NAWYWjZt", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PF6HUACCxujjSbdxtUzPuwbQUjXQd4eqF2__DGm1La5bR2Mpo1skkcxXyWErDSKQRUZwLvk8NAWYWjZt", + "type": "integer", + "value": 28602982006 + }, + { + "key": "%s%s%s__withdrawal__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__2pyjMwQx7T1LiWdrw4huDdYbGga3rcaK1n9MDba5yEnW", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__2pyjMwQx7T1LiWdrw4huDdYbGga3rcaK1n9MDba5yEnW", + "type": "integer", + "value": 37716698183 + }, + { + "key": "%s%s%s__withdrawal__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__EiGNbkvVnEHPUHmiZS3tk4VbupTZnLt6Cfot6i7zoToF", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__EiGNbkvVnEHPUHmiZS3tk4VbupTZnLt6Cfot6i7zoToF", + "type": "integer", + "value": 27500000000 + }, + { + "key": "%s%s%s__withdrawal__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__GJ6evDKg13d84WYbLiFHHpxnjdK17U3zVZmFjiEXWu7d", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__GJ6evDKg13d84WYbLiFHHpxnjdK17U3zVZmFjiEXWu7d", + "type": "integer", + "value": 19425217483 + }, + { + "key": "%s%s%s__withdrawal__3PFDVSLtgPpPxiFHsUxxkv7NvyCuRSDHBc3__5znpEMbF6XVjjBoaFe7N59evehdu596qTpiDapCj8u8", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFDVSLtgPpPxiFHsUxxkv7NvyCuRSDHBc3__5znpEMbF6XVjjBoaFe7N59evehdu596qTpiDapCj8u8", + "type": "integer", + "value": 1329650000 + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__21pzAUwcSzei1tNRnDgbCK3DVF5SGycbgkhrCFrLN2rC", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__21pzAUwcSzei1tNRnDgbCK3DVF5SGycbgkhrCFrLN2rC", + "type": "integer", + "value": 853395178 + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__4WKe5SVgEKrCZexAT3iUkDqWWcTbaENsC5HwSK4ZTLhF", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__4WKe5SVgEKrCZexAT3iUkDqWWcTbaENsC5HwSK4ZTLhF", + "type": "integer", + "value": 948221917 + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__5pQH4TWKJvruXuwNpHDcYpQk34wHUNVUHTcaYyDmZzFG", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__5pQH4TWKJvruXuwNpHDcYpQk34wHUNVUHTcaYyDmZzFG", + "type": "integer", + "value": 836139448 + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__7fvT8A1jzLFM3h1EJjhAvS4KLa3eLkJMoGKdusXV6MsD", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__7fvT8A1jzLFM3h1EJjhAvS4KLa3eLkJMoGKdusXV6MsD", + "type": "integer", + "value": 2447716766 + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__7qfu5uNDVj8jYLVMQs3fuGDLDvTAWzVicgJeFDPLiZXy", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__7qfu5uNDVj8jYLVMQs3fuGDLDvTAWzVicgJeFDPLiZXy", + "type": "integer", + "value": 5040352822 + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__8VboUZtkyb1p3EYbGsQmRFYcnpCLHuTKSu24662jjHDw", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__8VboUZtkyb1p3EYbGsQmRFYcnpCLHuTKSu24662jjHDw", + "type": "integer", + "value": 5368497816 + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__8keoiqVV7CFH1uaXcDsEZhbQWpHb7ivG6LmU55zKDeTZ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__8keoiqVV7CFH1uaXcDsEZhbQWpHb7ivG6LmU55zKDeTZ", + "type": "integer", + "value": 877626342 + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__9Vib76kWbBpFEVx4ZQFAaspJpvc5Zsd7RgCU3zt5KUCb", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__9Vib76kWbBpFEVx4ZQFAaspJpvc5Zsd7RgCU3zt5KUCb", + "type": "integer", + "value": 952908378 + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__CAhRoF7KXd7cDnXk31yvUYekJPjYqE7HdnM7EB3iKehV", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__CAhRoF7KXd7cDnXk31yvUYekJPjYqE7HdnM7EB3iKehV", + "type": "integer", + "value": 818033805 + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__Cwi2Zp5H8ZkV1oDJ5jnKnWmRXJbfAjdyU6TV5JtontvP", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__Cwi2Zp5H8ZkV1oDJ5jnKnWmRXJbfAjdyU6TV5JtontvP", + "type": "integer", + "value": 6971318575 + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__EcnS5iicxCTMmmHsgvPnkjh85EkXidcLcvE5goSeRMkr", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__EcnS5iicxCTMmmHsgvPnkjh85EkXidcLcvE5goSeRMkr", + "type": "integer", + "value": 1041600762 + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__F8rSHY3yNMMYY8XkBh8QSC1HyVsNMAFnqXZgk5wDEAuw", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__F8rSHY3yNMMYY8XkBh8QSC1HyVsNMAFnqXZgk5wDEAuw", + "type": "integer", + "value": 895971095 + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__HsPbzuB3n9RR4xfeJustcUWhJ6jff9WTkPZL4jR1sDwM", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__HsPbzuB3n9RR4xfeJustcUWhJ6jff9WTkPZL4jR1sDwM", + "type": "integer", + "value": 969197240 + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__wxp9E9tEpd4mncxTFSkqbXY9A1TppF2Ke51JFpkVjnT", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__wxp9E9tEpd4mncxTFSkqbXY9A1TppF2Ke51JFpkVjnT", + "type": "integer", + "value": 991072029 + }, + { + "key": "%s%s%s__withdrawal__3PFvxLPUxCY9Et5uyfkYLE4SDZ5oJTCFWsG__86yvd4JHwPtS322ZEkV6B4HCs6L9jYDWukT47FjuYDJX", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFvxLPUxCY9Et5uyfkYLE4SDZ5oJTCFWsG__86yvd4JHwPtS322ZEkV6B4HCs6L9jYDWukT47FjuYDJX", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s%s__withdrawal__3PFvxLPUxCY9Et5uyfkYLE4SDZ5oJTCFWsG__DEAxHFsgHCWipYK6NB5HndRrJqQrMHML37QEp8FkeC23", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFvxLPUxCY9Et5uyfkYLE4SDZ5oJTCFWsG__DEAxHFsgHCWipYK6NB5HndRrJqQrMHML37QEp8FkeC23", + "type": "integer", + "value": 47466546112 + }, + { + "key": "%s%s%s__withdrawal__3PFwm8UvcfcFUMLsxN2W3djtBgB1SPNBqRL__8ESBwLfuPzVx4ZACEKvMQ1RsMxLoYdqzWvyH4G462vuc", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFwm8UvcfcFUMLsxN2W3djtBgB1SPNBqRL__8ESBwLfuPzVx4ZACEKvMQ1RsMxLoYdqzWvyH4G462vuc", + "type": "integer", + "value": 27000000000 + }, + { + "key": "%s%s%s__withdrawal__3PFwyK4WEDb2qQ1wPFxG5rzyz7x2G1byMXz__Cm5btuYg9pPpVBz3ZuetVnmhWwU4jcycBVPKu81gJUL4", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PFwyK4WEDb2qQ1wPFxG5rzyz7x2G1byMXz__Cm5btuYg9pPpVBz3ZuetVnmhWwU4jcycBVPKu81gJUL4", + "type": "integer", + "value": 10000000 + }, + { + "key": "%s%s%s__withdrawal__3PGDywXYEdWACTs8rksuX9dxS3uGoWQpPyb__9z8Av1yEvy3PSAiqJ2xEG17RMf1zRYsYUQg5CMyrkRg7", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PGDywXYEdWACTs8rksuX9dxS3uGoWQpPyb__9z8Av1yEvy3PSAiqJ2xEG17RMf1zRYsYUQg5CMyrkRg7", + "type": "integer", + "value": 5000000000 + }, + { + "key": "%s%s%s__withdrawal__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__2YkRHtvmKRomGUWcLiSufyYkmaRKFjpDzm731PZ5Ca96", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__2YkRHtvmKRomGUWcLiSufyYkmaRKFjpDzm731PZ5Ca96", + "type": "integer", + "value": 5180026163 + } + ] +} \ No newline at end of file diff --git a/migrations/withdrawals/factory_dataTx_5.json b/migrations/withdrawals/factory_dataTx_5.json new file mode 100644 index 0000000..19377b4 --- /dev/null +++ b/migrations/withdrawals/factory_dataTx_5.json @@ -0,0 +1,458 @@ +{ + "type": 12, + "version": 2, + "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", + "fee": 1500000, + "data": [ + { + "key": "%s%s%s__withdrawal__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__2g3B8qVqV78FTTjmEZCofGQrA8e4PzayW21BhJ7aF4Se", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__2g3B8qVqV78FTTjmEZCofGQrA8e4PzayW21BhJ7aF4Se", + "type": "integer", + "value": 9106976438 + }, + { + "key": "%s%s%s__withdrawal__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__HaudTBcz2gJrEMgafNNDHJtZWWAKFigXukU6hR2a11gf", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__HaudTBcz2gJrEMgafNNDHJtZWWAKFigXukU6hR2a11gf", + "type": "integer", + "value": 10000000000 + }, + { + "key": "%s%s%s__withdrawal__3PGfXB5bEz7EkbtGMNUYop5aior5X6bUbvL__E3dhm3skoxPa8Pf1tt7Vai8ofmptVTDn7ngwzyEYXQcQ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PGfXB5bEz7EkbtGMNUYop5aior5X6bUbvL__E3dhm3skoxPa8Pf1tt7Vai8ofmptVTDn7ngwzyEYXQcQ", + "type": "integer", + "value": 23598235634 + }, + { + "key": "%s%s%s__withdrawal__3PH152STC5wrrSfAzzFerES8fSZaDXjvGHN__MeUeMVfgkCLzBH5fYfaExCxq6VXcniyNuxoq7fnEHhy", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PH152STC5wrrSfAzzFerES8fSZaDXjvGHN__MeUeMVfgkCLzBH5fYfaExCxq6VXcniyNuxoq7fnEHhy", + "type": "integer", + "value": 1885035978 + }, + { + "key": "%s%s%s__withdrawal__3PH3K5hyTYgM7Knt4vaXb9vbYZUABJQAFse__fmCRyZEiZyh74rFFvKs5piprrHrkvKhpxpZkEkfjCYC", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PH3K5hyTYgM7Knt4vaXb9vbYZUABJQAFse__fmCRyZEiZyh74rFFvKs5piprrHrkvKhpxpZkEkfjCYC", + "type": "integer", + "value": 154089136376 + }, + { + "key": "%s%s%s__withdrawal__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ__6y3o7fQZhi6kfyGPsbKpqK74tEGNBzf4Sb15LQfkJEaX", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ__6y3o7fQZhi6kfyGPsbKpqK74tEGNBzf4Sb15LQfkJEaX", + "type": "integer", + "value": 25461374 + }, + { + "key": "%s%s%s__withdrawal__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ__7sPzPdB2sCu7K2xK7est4NrBqCXjkKq3oiVE6j3Xspft", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ__7sPzPdB2sCu7K2xK7est4NrBqCXjkKq3oiVE6j3Xspft", + "type": "integer", + "value": 100011502579 + }, + { + "key": "%s%s%s__withdrawal__3PHvG6exQVNMLfNKY61F7EdPz5ByadQMstu__HfBo5aXhynH5G5N6QS9edxaPD5upjUFcM1Mr9Dewwwww", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PHvG6exQVNMLfNKY61F7EdPz5ByadQMstu__HfBo5aXhynH5G5N6QS9edxaPD5upjUFcM1Mr9Dewwwww", + "type": "integer", + "value": 124206166 + }, + { + "key": "%s%s%s__withdrawal__3PJ4dDgEyksWRdDBrZkCjFrURTcGCk7WN1c__CNJtg4SKiRtYHCUtFqcL6McFEwivbTM8w1QvnSNdHBMC", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PJ4dDgEyksWRdDBrZkCjFrURTcGCk7WN1c__CNJtg4SKiRtYHCUtFqcL6McFEwivbTM8w1QvnSNdHBMC", + "type": "integer", + "value": 13284185188 + }, + { + "key": "%s%s%s__withdrawal__3PJNxRGLG5wuuqcVjn7uviv4qaLfuq75xLH__4cdedswSNyVkYp3uYLk2wcTNgUtdsWh2qg5SPMNuTtrJ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PJNxRGLG5wuuqcVjn7uviv4qaLfuq75xLH__4cdedswSNyVkYp3uYLk2wcTNgUtdsWh2qg5SPMNuTtrJ", + "type": "integer", + "value": 24517194 + }, + { + "key": "%s%s%s__withdrawal__3PJNxRGLG5wuuqcVjn7uviv4qaLfuq75xLH__7V2PYFFNc6TE4qpLqKREEqucSTSVVbdHy8yFj7Gvtq1a", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PJNxRGLG5wuuqcVjn7uviv4qaLfuq75xLH__7V2PYFFNc6TE4qpLqKREEqucSTSVVbdHy8yFj7Gvtq1a", + "type": "integer", + "value": 29861169 + }, + { + "key": "%s%s%s__withdrawal__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__4knQr5WwBKxWKCQ1MpwzdPrnT255AXsS7jdDK8x6YT5T", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__4knQr5WwBKxWKCQ1MpwzdPrnT255AXsS7jdDK8x6YT5T", + "type": "integer", + "value": 6188870786 + }, + { + "key": "%s%s%s__withdrawal__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__6v6ePQu3PnXEMAigcgekbSCsvA4KiTGqnVtwByAwSZKM", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__6v6ePQu3PnXEMAigcgekbSCsvA4KiTGqnVtwByAwSZKM", + "type": "integer", + "value": 82025420216 + }, + { + "key": "%s%s%s__withdrawal__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__8NgLkdidMJmkTjrPxmEJ6i3MkKHBYxdHYRwCvfYhvAZq", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__8NgLkdidMJmkTjrPxmEJ6i3MkKHBYxdHYRwCvfYhvAZq", + "type": "integer", + "value": 38636714359 + }, + { + "key": "%s%s%s__withdrawal__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__CyVzTbazC9Vc2VU74icsethm8boSi2oSXMM6hnox5B7y", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__CyVzTbazC9Vc2VU74icsethm8boSi2oSXMM6hnox5B7y", + "type": "integer", + "value": 5518279136 + }, + { + "key": "%s%s%s__withdrawal__3PJgDho14MN1ueX7D1kp2XJ3McggppfdQeT__38iTvkJJGpmAGwfk9rq5NsjUfhkbmhzvVwBWdFuz51z1", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PJgDho14MN1ueX7D1kp2XJ3McggppfdQeT__38iTvkJJGpmAGwfk9rq5NsjUfhkbmhzvVwBWdFuz51z1", + "type": "integer", + "value": 2279400001 + }, + { + "key": "%s%s%s__withdrawal__3PJgDho14MN1ueX7D1kp2XJ3McggppfdQeT__CKEtuKLzyAHPXYWVtkynKwoXRYFoKvYRN8PHE3ZuY1zj", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PJgDho14MN1ueX7D1kp2XJ3McggppfdQeT__CKEtuKLzyAHPXYWVtkynKwoXRYFoKvYRN8PHE3ZuY1zj", + "type": "integer", + "value": 189950000 + }, + { + "key": "%s%s%s__withdrawal__3PJjnz3z24vwDResuNo4Bgth1rYRre267qj__ChmdhRHtUmM7rRhtBPEgzHWQMUNfcdWhpCLr3ZsD2cuL", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PJjnz3z24vwDResuNo4Bgth1rYRre267qj__ChmdhRHtUmM7rRhtBPEgzHWQMUNfcdWhpCLr3ZsD2cuL", + "type": "integer", + "value": 504850444 + }, + { + "key": "%s%s%s__withdrawal__3PJjnz3z24vwDResuNo4Bgth1rYRre267qj__nmwa4843duu5nYoST9vouGKa8y4HwqAc12T3jHhPYB8", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PJjnz3z24vwDResuNo4Bgth1rYRre267qj__nmwa4843duu5nYoST9vouGKa8y4HwqAc12T3jHhPYB8", + "type": "integer", + "value": 1057278448 + }, + { + "key": "%s%s%s__withdrawal__3PJmNd7oXYHqDD92xYH4f6zxNxEV45togP3__4fUGeVxgWtHgqXLkEYhnKWGsNWciAfhieUSUnBfckkZZ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PJmNd7oXYHqDD92xYH4f6zxNxEV45togP3__4fUGeVxgWtHgqXLkEYhnKWGsNWciAfhieUSUnBfckkZZ", + "type": "integer", + "value": 1000000000 + }, + { + "key": "%s%s%s__withdrawal__3PJqcYDtN8RFLWoJCSosrxjTptgV9JFnQtp__DCffPCZfZ6crHWQrP8WH3a1cCQv6AzTNSpLxZCRV4iej", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PJqcYDtN8RFLWoJCSosrxjTptgV9JFnQtp__DCffPCZfZ6crHWQrP8WH3a1cCQv6AzTNSpLxZCRV4iej", + "type": "integer", + "value": 2212261405 + }, + { + "key": "%s%s%s__withdrawal__3PK8PvRf4Zdh893ntCTYSSGdSWaoKB4PUr3__9uK84Q6PvCgVdL2QXx4i5WRxXtVRv9eiwTk3Vbs9hxGM", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PK8PvRf4Zdh893ntCTYSSGdSWaoKB4PUr3__9uK84Q6PvCgVdL2QXx4i5WRxXtVRv9eiwTk3Vbs9hxGM", + "type": "integer", + "value": 124545050 + }, + { + "key": "%s%s%s__withdrawal__3PLBFxFwMgTNPptA8RnygTpPYazoWeSf3BS__5vcyoTeY7MtjDbD4YquDzdghqxbYBiznzQGtrTmLaYYf", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PLBFxFwMgTNPptA8RnygTpPYazoWeSf3BS__5vcyoTeY7MtjDbD4YquDzdghqxbYBiznzQGtrTmLaYYf", + "type": "integer", + "value": 5131396987 + }, + { + "key": "%s%s%s__withdrawal__3PLBFxFwMgTNPptA8RnygTpPYazoWeSf3BS__FmjNfBKycYTU9USTmyEVnToNanKdpBqzM4ShShvG8vi5", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PLBFxFwMgTNPptA8RnygTpPYazoWeSf3BS__FmjNfBKycYTU9USTmyEVnToNanKdpBqzM4ShShvG8vi5", + "type": "integer", + "value": 2214188025 + }, + { + "key": "%s%s%s__withdrawal__3PLTWcc26QWMkrmRvYqBkn6hTfwpmGRXTun__6HXFMAMEPXWXRToG6NTUYdYNCtjVhGjzgRRcLdqoJm8Q", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PLTWcc26QWMkrmRvYqBkn6hTfwpmGRXTun__6HXFMAMEPXWXRToG6NTUYdYNCtjVhGjzgRRcLdqoJm8Q", + "type": "integer", + "value": 11491448494 + }, + { + "key": "%s%s%s__withdrawal__3PLTWcc26QWMkrmRvYqBkn6hTfwpmGRXTun__8EiiCbEB81B4nGb275pD469tdUmmwqtHTeGGv9mWnUKi", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PLTWcc26QWMkrmRvYqBkn6hTfwpmGRXTun__8EiiCbEB81B4nGb275pD469tdUmmwqtHTeGGv9mWnUKi", + "type": "integer", + "value": 9005898638 + }, + { + "key": "%s%s%s__withdrawal__3PLfnQ8fCS2nyFdUh2Fmp8dJN7fs69jAhA5__8bN6rSyBPkX1QdKMEnNhkCRCWNZKVhnYJuxqMCn6G2iJ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PLfnQ8fCS2nyFdUh2Fmp8dJN7fs69jAhA5__8bN6rSyBPkX1QdKMEnNhkCRCWNZKVhnYJuxqMCn6G2iJ", + "type": "integer", + "value": 21219694522 + }, + { + "key": "%s%s%s__withdrawal__3PLfnQ8fCS2nyFdUh2Fmp8dJN7fs69jAhA5__GduqkYkLFpt7Y1BncCJMViiTH3ojdqbVKHzTuSEdZHFE", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PLfnQ8fCS2nyFdUh2Fmp8dJN7fs69jAhA5__GduqkYkLFpt7Y1BncCJMViiTH3ojdqbVKHzTuSEdZHFE", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s%s__withdrawal__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__AkGRx1V9ojAux2getmZRRdUn23n89KKsmstVwcAGAuZb", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__AkGRx1V9ojAux2getmZRRdUn23n89KKsmstVwcAGAuZb", + "type": "integer", + "value": 1104595300 + }, + { + "key": "%s%s%s__withdrawal__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__H3wvP5J2x4iJbjNaJbJQjHm4MKAE4CLaVbVnG4HEgRHp", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__H3wvP5J2x4iJbjNaJbJQjHm4MKAE4CLaVbVnG4HEgRHp", + "type": "integer", + "value": 22024474326 + }, + { + "key": "%s%s%s__withdrawal__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__d6EnCTDD2hwDfmLiEq13yZoEo8n5JsjxhMybwdMuYNt", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__d6EnCTDD2hwDfmLiEq13yZoEo8n5JsjxhMybwdMuYNt", + "type": "integer", + "value": 10247942923 + }, + { + "key": "%s%s%s__withdrawal__3PMdqvU8tP5zBi4wEEFpaoNmvwXoqkkyYQS__HiAFnb8esSwj77Abn3LZjS5PiFnfi2QmPVyCwv2KJawb", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMdqvU8tP5zBi4wEEFpaoNmvwXoqkkyYQS__HiAFnb8esSwj77Abn3LZjS5PiFnfi2QmPVyCwv2KJawb", + "type": "integer", + "value": 10640600586 + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__5Qtp38JZfnJnoAmu6ADLGKcYwi9aDLmMVUQZYe7rhaai", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__5Qtp38JZfnJnoAmu6ADLGKcYwi9aDLmMVUQZYe7rhaai", + "type": "integer", + "value": 50100000000 + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__5idixthp7izdiGwG3ua26epBvYqAYV7zQqZwghDFZHKy", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__5idixthp7izdiGwG3ua26epBvYqAYV7zQqZwghDFZHKy", + "type": "integer", + "value": 10000000000 + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__6Bb76YoswJGwC61ztQLCU3hprSEXMtFC11sXYHvJG2dG", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__6Bb76YoswJGwC61ztQLCU3hprSEXMtFC11sXYHvJG2dG", + "type": "integer", + "value": 10000000000 + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__7fTFc6DDvN4Mn3G9JWEmyPpYqwzARbipDDMRyEsWcgkC", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__7fTFc6DDvN4Mn3G9JWEmyPpYqwzARbipDDMRyEsWcgkC", + "type": "integer", + "value": 1000000000 + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__A6vsyPJcHey5kUsFud5yesGGZGkQ4XXRQ63jf3XKdZHH", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__A6vsyPJcHey5kUsFud5yesGGZGkQ4XXRQ63jf3XKdZHH", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__BsQM5CxBt9EtKxK33UnvhHM9AKebhgz2XVLed3r8LTDS", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__BsQM5CxBt9EtKxK33UnvhHM9AKebhgz2XVLed3r8LTDS", + "type": "integer", + "value": 1000000000 + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__EpJ7YWwgQc6HSdPWJqHyaEfWbZx6Upi1Ym1NUPNnQQVR", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__EpJ7YWwgQc6HSdPWJqHyaEfWbZx6Upi1Ym1NUPNnQQVR", + "type": "integer", + "value": 300000000 + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__Er8WrcbpbuCUfTdXyu8268nTvosKADinLtmDASuPny2E", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__Er8WrcbpbuCUfTdXyu8268nTvosKADinLtmDASuPny2E", + "type": "integer", + "value": 57900000000 + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__FMCisHCSp1kHs4F4S2ERE8arTWM19X2NHK4tHKxkJwjf", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__FMCisHCSp1kHs4F4S2ERE8arTWM19X2NHK4tHKxkJwjf", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__HQG8EFhSgCewE6GTX6xQxZyxRBX9TPoZjqbaTXAEJgQ1", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__HQG8EFhSgCewE6GTX6xQxZyxRBX9TPoZjqbaTXAEJgQ1", + "type": "integer", + "value": 50000000000 + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__gTcfTtexav7mMB1vfLRZpZDCGYteh9PtUM2oAH5r9xD", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__gTcfTtexav7mMB1vfLRZpZDCGYteh9PtUM2oAH5r9xD", + "type": "integer", + "value": 11318283824 + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__2HG1fz3cjhudSbQsopmybexvZFCDP2uUqEabjCW5qbVT", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__2HG1fz3cjhudSbQsopmybexvZFCDP2uUqEabjCW5qbVT", + "type": "integer", + "value": 1372000000 + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__5Jpai82zXxZwPRPWZ6A1h7xHdHJppMM59FAz9FCdUGr3", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__5Jpai82zXxZwPRPWZ6A1h7xHdHJppMM59FAz9FCdUGr3", + "type": "integer", + "value": 1707615511 + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__5cXxKQpeUzwsB7awHRaXd9WdAomHjn5BX3P4MJR8rHhK", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__5cXxKQpeUzwsB7awHRaXd9WdAomHjn5BX3P4MJR8rHhK", + "type": "integer", + "value": 1500000000 + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__6YRPZqJ4akuMkwJxc5H5RnPD9Fk7oZSJY5nxvacyibbF", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__6YRPZqJ4akuMkwJxc5H5RnPD9Fk7oZSJY5nxvacyibbF", + "type": "integer", + "value": 1662107678 + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__7mRDLhhRGKeTaDcn58zKmVACvZhUZXmL4rdi5JKX5QZF", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__7mRDLhhRGKeTaDcn58zKmVACvZhUZXmL4rdi5JKX5QZF", + "type": "integer", + "value": 985541647 + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__8YtcxL6tQ9oJ6f7tZ8Yz7HLdgKzEHMrQ4E7zgz5Nfgm7", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__8YtcxL6tQ9oJ6f7tZ8Yz7HLdgKzEHMrQ4E7zgz5Nfgm7", + "type": "integer", + "value": 1578268987 + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__9b6dXskPLQUsAJa4dSBusgczRFYBVHG5k3fC5jrhgCNd", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__9b6dXskPLQUsAJa4dSBusgczRFYBVHG5k3fC5jrhgCNd", + "type": "integer", + "value": 6612359551 + } + ] +} \ No newline at end of file diff --git a/migrations/withdrawals/factory_dataTx_6.json b/migrations/withdrawals/factory_dataTx_6.json new file mode 100644 index 0000000..9d9dbb0 --- /dev/null +++ b/migrations/withdrawals/factory_dataTx_6.json @@ -0,0 +1,458 @@ +{ + "type": 12, + "version": 2, + "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", + "fee": 1500000, + "data": [ + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__C1bbtiktW93mhKw59EcjXVfjqd2yYa1vp2LjabfLCees", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__C1bbtiktW93mhKw59EcjXVfjqd2yYa1vp2LjabfLCees", + "type": "integer", + "value": 1082417979 + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__CC7fYgcqbNa77GbsBbsHY2cExwk9tyJdSpB3Wig1ohYQ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__CC7fYgcqbNa77GbsBbsHY2cExwk9tyJdSpB3Wig1ohYQ", + "type": "integer", + "value": 2250354116 + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__E31rNTSNJ5tRdtZV9DepzDkesqrKVwko3HcWtaDrSyFD", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__E31rNTSNJ5tRdtZV9DepzDkesqrKVwko3HcWtaDrSyFD", + "type": "integer", + "value": 800000000 + }, + { + "key": "%s%s%s__withdrawal__3PMn1g4oEd6q6Fx2zEzs8EBbsRHaCTUSwTd__4sSwNRdn2CX7pmEa4ee6oYY1R7XeUd8qAkMdtwGR5fcG", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMn1g4oEd6q6Fx2zEzs8EBbsRHaCTUSwTd__4sSwNRdn2CX7pmEa4ee6oYY1R7XeUd8qAkMdtwGR5fcG", + "type": "integer", + "value": 27770337947 + }, + { + "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__6f4izjAtjTyz49srEFkDYQKg3VZh85MrGaqD5853uRr9", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__6f4izjAtjTyz49srEFkDYQKg3VZh85MrGaqD5853uRr9", + "type": "integer", + "value": 150000000000 + }, + { + "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__9xbVkc3grQBeBCrxX1fd3wusWa14cZtDhkFGx5A8Q2qp", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__9xbVkc3grQBeBCrxX1fd3wusWa14cZtDhkFGx5A8Q2qp", + "type": "integer", + "value": 60120000000 + }, + { + "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__AHQJMxSgrCkevZNWzBCcik2CT971kuRiQGWQfq2Z2Et4", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__AHQJMxSgrCkevZNWzBCcik2CT971kuRiQGWQfq2Z2Et4", + "type": "integer", + "value": 102000000000 + }, + { + "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__AsmantJEUSf6FcovCUGMeLqY2Tju6Ph5gEfNy91QzWVK", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__AsmantJEUSf6FcovCUGMeLqY2Tju6Ph5gEfNy91QzWVK", + "type": "integer", + "value": 23000000000 + }, + { + "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__HMxC1o7rAnWDSXqeqWT9GnPWxTbF9GWXRGPRVHi3DgGy", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__HMxC1o7rAnWDSXqeqWT9GnPWxTbF9GWXRGPRVHi3DgGy", + "type": "integer", + "value": 112000000000 + }, + { + "key": "%s%s%s__withdrawal__3PN2JRxJxjjZo1YJGyQrxdhoEbijc24BMY3__2tJMUah5hfeYuEoRrCFTKz18DSkqoguY3b9LweSfobKW", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PN2JRxJxjjZo1YJGyQrxdhoEbijc24BMY3__2tJMUah5hfeYuEoRrCFTKz18DSkqoguY3b9LweSfobKW", + "type": "integer", + "value": 100000000 + }, + { + "key": "%s%s%s__withdrawal__3PNE4mzP29TyWqFcYwnY81rbH3VwV6yhz3F__4qDYxDrqNVTJZzk3BxbT2uKNv1CsWRzBzTfUTNZyRc8Q", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PNE4mzP29TyWqFcYwnY81rbH3VwV6yhz3F__4qDYxDrqNVTJZzk3BxbT2uKNv1CsWRzBzTfUTNZyRc8Q", + "type": "integer", + "value": 7500000000 + }, + { + "key": "%s%s%s__withdrawal__3PNE4mzP29TyWqFcYwnY81rbH3VwV6yhz3F__DRHaW2EnaG2prxNZNQwLh98fr435A2JEZch1Z1TuBohu", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PNE4mzP29TyWqFcYwnY81rbH3VwV6yhz3F__DRHaW2EnaG2prxNZNQwLh98fr435A2JEZch1Z1TuBohu", + "type": "integer", + "value": 11219572500 + }, + { + "key": "%s%s%s__withdrawal__3PNMYZEJvMFpsAtuGszT4pmZkGuq6wkm2C3__7r4aeFjEN8xQ9FUTDxWVLGsh6Sjmcodppxu1QQ159nrH", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PNMYZEJvMFpsAtuGszT4pmZkGuq6wkm2C3__7r4aeFjEN8xQ9FUTDxWVLGsh6Sjmcodppxu1QQ159nrH", + "type": "integer", + "value": 2511376 + }, + { + "key": "%s%s%s__withdrawal__3PNMYZEJvMFpsAtuGszT4pmZkGuq6wkm2C3__9JZcvCkjkjwrrGXfUjdWS8cgVQs9dGnYK3fxtqwuKLao", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PNMYZEJvMFpsAtuGszT4pmZkGuq6wkm2C3__9JZcvCkjkjwrrGXfUjdWS8cgVQs9dGnYK3fxtqwuKLao", + "type": "integer", + "value": 1464210 + }, + { + "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__33iZJHJMKsjUk5H8YqhBZxSD2DKRiCmNrqHHe5E4qauN", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__33iZJHJMKsjUk5H8YqhBZxSD2DKRiCmNrqHHe5E4qauN", + "type": "integer", + "value": 264973207 + }, + { + "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__Akfx7XfCpbux94eJ8iK4WS5AxJQTbZU3ksfVWaYmaoWm", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__Akfx7XfCpbux94eJ8iK4WS5AxJQTbZU3ksfVWaYmaoWm", + "type": "integer", + "value": 352096109 + }, + { + "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__BtFtoTvrydPWPVNjCfuKSFfLG1qmosoxRX5Po93CUAd7", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__BtFtoTvrydPWPVNjCfuKSFfLG1qmosoxRX5Po93CUAd7", + "type": "integer", + "value": 397158954 + }, + { + "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__CEiaGJM3QMPCiwst4VodF61F1dx4CuPiJ5LiWuyb96Dn", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__CEiaGJM3QMPCiwst4VodF61F1dx4CuPiJ5LiWuyb96Dn", + "type": "integer", + "value": 410380041 + }, + { + "key": "%s%s%s__withdrawal__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__9DBajjZRQJtjxea9JX7dgDqfVoq34Vyaw26oZDimKe9u", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__9DBajjZRQJtjxea9JX7dgDqfVoq34Vyaw26oZDimKe9u", + "type": "integer", + "value": 3553759632 + }, + { + "key": "%s%s%s__withdrawal__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__Gtx3Vyf9jagWnnpPyRkbSwtGEvcbsU9BqVbMNHcAXr9h", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__Gtx3Vyf9jagWnnpPyRkbSwtGEvcbsU9BqVbMNHcAXr9h", + "type": "integer", + "value": 23855625373 + }, + { + "key": "%s%s%s__withdrawal__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__n3PP9EvGbGYrS32aX9oDabRyRKj42KFmP5ufb7Y6ght", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__n3PP9EvGbGYrS32aX9oDabRyRKj42KFmP5ufb7Y6ght", + "type": "integer", + "value": 4467412173 + }, + { + "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__2ebkb2cLaZXmyEisyTnBizosMSdm1hWU1TVePWZCJ5fF", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__2ebkb2cLaZXmyEisyTnBizosMSdm1hWU1TVePWZCJ5fF", + "type": "integer", + "value": 4720830954 + }, + { + "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__B6xmUHwecRUDQa2NTJDwL4WqmJCGaV5AaaAT3Pgt2RF6", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__B6xmUHwecRUDQa2NTJDwL4WqmJCGaV5AaaAT3Pgt2RF6", + "type": "integer", + "value": 3722048229 + }, + { + "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__BNUreyUB7YSPWWrMicjGzgt9wxzAkAco2MK7kGQBysYe", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__BNUreyUB7YSPWWrMicjGzgt9wxzAkAco2MK7kGQBysYe", + "type": "integer", + "value": 4949999601 + }, + { + "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__H1R65xBvcB1fLwRBvfXYFjpuMGkL35FFicaj1cqvK55g", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__H1R65xBvcB1fLwRBvfXYFjpuMGkL35FFicaj1cqvK55g", + "type": "integer", + "value": 859876593 + }, + { + "key": "%s%s%s__withdrawal__3PPF9dNLQxrg6ARTkNnSuo6rAhuDo68YQ7r__EApLgiPoLyHpBiBqXnyjVi9LpnpTzbLdKBsiZSLMbqjf", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPF9dNLQxrg6ARTkNnSuo6rAhuDo68YQ7r__EApLgiPoLyHpBiBqXnyjVi9LpnpTzbLdKBsiZSLMbqjf", + "type": "integer", + "value": 4705014510 + }, + { + "key": "%s%s%s__withdrawal__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__9Diy1w6Mj2NHgdMB5PvbESzuki1DN8P86PFv9qeykAP7", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__9Diy1w6Mj2NHgdMB5PvbESzuki1DN8P86PFv9qeykAP7", + "type": "integer", + "value": 58973700 + }, + { + "key": "%s%s%s__withdrawal__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__F5arLeYN68LYMDJz7EXHyouk7WcAtUNtuMZs3ejZm3F4", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__F5arLeYN68LYMDJz7EXHyouk7WcAtUNtuMZs3ejZm3F4", + "type": "integer", + "value": 245284462 + }, + { + "key": "%s%s%s__withdrawal__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__HjHFEAS7pz8J8HLmgBS7rZqzXsu9Yti1JASsSrWRveWr", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__HjHFEAS7pz8J8HLmgBS7rZqzXsu9Yti1JASsSrWRveWr", + "type": "integer", + "value": 126448836 + }, + { + "key": "%s%s%s__withdrawal__3PPPTqGUYHJUYqKkRCV3kAS44guun9iN7J8__Aquz2sGoefWKdV6ER1xJeepHR8yUvP4V1Fp4ixRzH25G", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPPTqGUYHJUYqKkRCV3kAS44guun9iN7J8__Aquz2sGoefWKdV6ER1xJeepHR8yUvP4V1Fp4ixRzH25G", + "type": "integer", + "value": 57668312500 + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__3vg8kegbVm2ejmrW7xaMUV6KdZ61cWmVs6KE1MRpdna2", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__3vg8kegbVm2ejmrW7xaMUV6KdZ61cWmVs6KE1MRpdna2", + "type": "integer", + "value": 88986460 + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5CFLiisJTWnVMBjc6UYKH9cA37Zg2fvtMDTj98Qo1s8b", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5CFLiisJTWnVMBjc6UYKH9cA37Zg2fvtMDTj98Qo1s8b", + "type": "integer", + "value": 47556289 + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5Jxs9Rb9wVXf7j3ZsZA4Mkumth9Uc7dkuUzvbZFxVRS", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5Jxs9Rb9wVXf7j3ZsZA4Mkumth9Uc7dkuUzvbZFxVRS", + "type": "integer", + "value": 43706593 + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5WRLsrAPUSqE3R62TB3UG3uAnEPJmiFhQK8LZ2qRfhKE", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5WRLsrAPUSqE3R62TB3UG3uAnEPJmiFhQK8LZ2qRfhKE", + "type": "integer", + "value": 12064822 + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__6PgMYrWFnB1NyCcNLhYwoqbtwrcphZEDA3LAwyZfgdvo", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__6PgMYrWFnB1NyCcNLhYwoqbtwrcphZEDA3LAwyZfgdvo", + "type": "integer", + "value": 92521109 + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__98nS5WboAyAdDDW91Wvjaxtj179FEeaJx1C48DRJTtee", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__98nS5WboAyAdDDW91Wvjaxtj179FEeaJx1C48DRJTtee", + "type": "integer", + "value": 49647212 + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__9TUKDy1kHtZtevGbwmeUJomF89hg4jv5QuNLqbA3JPu5", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__9TUKDy1kHtZtevGbwmeUJomF89hg4jv5QuNLqbA3JPu5", + "type": "integer", + "value": 42112827 + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__9oPVAXjVUkuarf4Jy5JyHcsVJBAyVxyjdVMvU6neMx9m", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__9oPVAXjVUkuarf4Jy5JyHcsVJBAyVxyjdVMvU6neMx9m", + "type": "integer", + "value": 272651656 + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__CtP9dMwb1rJbPWgVbvNM8qJmh3NX7XhPiAbQFG9A5YW", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__CtP9dMwb1rJbPWgVbvNM8qJmh3NX7XhPiAbQFG9A5YW", + "type": "integer", + "value": 47485678 + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__GKvQpH5qyNFDwBjszeopK57za2RKPhtrV2YH6H5MqQDH", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__GKvQpH5qyNFDwBjszeopK57za2RKPhtrV2YH6H5MqQDH", + "type": "integer", + "value": 51021072 + }, + { + "key": "%s%s%s__withdrawal__3PPVhnD2CG64dvGrKcXabDyg9zMyvwXQkA4__8Tfk3vV78xCGEYWwz8aUPsWdym4AgUPjMenKZh93VD8q", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPVhnD2CG64dvGrKcXabDyg9zMyvwXQkA4__8Tfk3vV78xCGEYWwz8aUPsWdym4AgUPjMenKZh93VD8q", + "type": "integer", + "value": 582547612 + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__6j9z4RYqcE5jLq9dNWVnirXXiJ8vdyUv2ReJBDjqD9xX", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__6j9z4RYqcE5jLq9dNWVnirXXiJ8vdyUv2ReJBDjqD9xX", + "type": "integer", + "value": 794114838 + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__8hddFNEJ3Qt4yHUKexAE7nddnRhT9gD5vRdGVvWcMzux", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__8hddFNEJ3Qt4yHUKexAE7nddnRhT9gD5vRdGVvWcMzux", + "type": "integer", + "value": 1127422959 + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__AQeSJmdEX9BM5R3LACFdiCHY8F7XgdoCspZJbGgtBPXm", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__AQeSJmdEX9BM5R3LACFdiCHY8F7XgdoCspZJbGgtBPXm", + "type": "integer", + "value": 1112701754 + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__C5i6YLpJwctyXrHYQ2wc1t1pv6mSVvJ93DH4yxnD73xQ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__C5i6YLpJwctyXrHYQ2wc1t1pv6mSVvJ93DH4yxnD73xQ", + "type": "integer", + "value": 290121282 + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__C6benzi7c8F638LWtTMxz8MbRTv8EC7G7TrzJNAkL7hN", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__C6benzi7c8F638LWtTMxz8MbRTv8EC7G7TrzJNAkL7hN", + "type": "integer", + "value": 3807508493 + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__EuaDZJsUjWcMyMUxKLrCAAZEFut7MDAb3hx7MK2WKXoo", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__EuaDZJsUjWcMyMUxKLrCAAZEFut7MDAb3hx7MK2WKXoo", + "type": "integer", + "value": 1388252316 + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__FYA2ByvLvACU5WwQvdU7wH1ViJmMGQUxgLF4KhU2Lg9E", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__FYA2ByvLvACU5WwQvdU7wH1ViJmMGQUxgLF4KhU2Lg9E", + "type": "integer", + "value": 395958686 + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__GetcvZmgP3jvFAwB7CvjBvPxArzxDCcRN14FhZKRh9Gq", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__GetcvZmgP3jvFAwB7CvjBvPxArzxDCcRN14FhZKRh9Gq", + "type": "integer", + "value": 436554860 + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__k7tCtzPDF7cV2ytLXqxgPfysczzJ2T2Moo4ViPKoALj", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__k7tCtzPDF7cV2ytLXqxgPfysczzJ2T2Moo4ViPKoALj", + "type": "integer", + "value": 439418250 + } + ] +} \ No newline at end of file diff --git a/migrations/withdrawals/factory_dataTx_7.json b/migrations/withdrawals/factory_dataTx_7.json new file mode 100644 index 0000000..9a38df4 --- /dev/null +++ b/migrations/withdrawals/factory_dataTx_7.json @@ -0,0 +1,305 @@ +{ + "type": 12, + "version": 2, + "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", + "fee": 1200000, + "data": [ + { + "key": "%s%s%s__withdrawal__3PPaeRJpqdmWaNii5WvcvwmDteXZ8RkbTqA__2t3E4Y6TmgdCMn7UAjUQ97cGWgTRJdk6wEx3bkBBodJP", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPaeRJpqdmWaNii5WvcvwmDteXZ8RkbTqA__2t3E4Y6TmgdCMn7UAjUQ97cGWgTRJdk6wEx3bkBBodJP", + "type": "integer", + "value": 2852701640 + }, + { + "key": "%s%s%s__withdrawal__3PPoHiMrFPAKBsUKiBajVGzSrUGpz1hdJ7W__BhUKSTTLGA9G7R8PrYrLWtyHCXp5KcayxAJcpMUSGaV2", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPoHiMrFPAKBsUKiBajVGzSrUGpz1hdJ7W__BhUKSTTLGA9G7R8PrYrLWtyHCXp5KcayxAJcpMUSGaV2", + "type": "integer", + "value": 744927014 + }, + { + "key": "%s%s%s__withdrawal__3PPoHiMrFPAKBsUKiBajVGzSrUGpz1hdJ7W__CCEu4evWfwPyqL84DWiUbEGvVMiny2HU6daC99Ypinjt", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPoHiMrFPAKBsUKiBajVGzSrUGpz1hdJ7W__CCEu4evWfwPyqL84DWiUbEGvVMiny2HU6daC99Ypinjt", + "type": "integer", + "value": 517848375 + }, + { + "key": "%s%s%s__withdrawal__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__52LeJ3r4JSVCMFRDsfnMvMsJejtYbB1iq3kRfLhyZGuJ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__52LeJ3r4JSVCMFRDsfnMvMsJejtYbB1iq3kRfLhyZGuJ", + "type": "integer", + "value": 50000000 + }, + { + "key": "%s%s%s__withdrawal__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__8VcrH4zxgYKX8M9V3DHrDZwrRdeTfKaVE5z4pR2gmUGK", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__8VcrH4zxgYKX8M9V3DHrDZwrRdeTfKaVE5z4pR2gmUGK", + "type": "integer", + "value": 300000000 + }, + { + "key": "%s%s%s__withdrawal__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__CKXSfCRMUy4ecdSCz7QNAcKUcGGBetKt2vQqDG7H2f8M", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__CKXSfCRMUy4ecdSCz7QNAcKUcGGBetKt2vQqDG7H2f8M", + "type": "integer", + "value": 650000000 + }, + { + "key": "%s%s%s__withdrawal__3PQBxD7LjHw9vag6XohS9QFs9EyFDBUWzA6__6oN7aQFiYSUVzWCjYHWGeVzYfVpCqBwiSqcZc1WNdZND", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQBxD7LjHw9vag6XohS9QFs9EyFDBUWzA6__6oN7aQFiYSUVzWCjYHWGeVzYfVpCqBwiSqcZc1WNdZND", + "type": "integer", + "value": 6488412500 + }, + { + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__AJtPpEpBvuDwBKxMDdxLLFxF43Wvso4iLRjDxrevhnF7", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__AJtPpEpBvuDwBKxMDdxLLFxF43Wvso4iLRjDxrevhnF7", + "type": "integer", + "value": 1990048072 + }, + { + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__ApDtWNtZSFTZAZ5YhW1BWgtBJMaM35vseAZKno1kvqFb", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__ApDtWNtZSFTZAZ5YhW1BWgtBJMaM35vseAZKno1kvqFb", + "type": "integer", + "value": 224432354 + }, + { + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__BvPELHTyNfM9vFD7LZtNZ8Z5T9sghkRgPk78ciiLYekp", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__BvPELHTyNfM9vFD7LZtNZ8Z5T9sghkRgPk78ciiLYekp", + "type": "integer", + "value": 1537932461 + }, + { + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__CNdg1ue8v4KRoAotXfrvNMq6WWb4X1kwXPnWZgRAqLE5", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__CNdg1ue8v4KRoAotXfrvNMq6WWb4X1kwXPnWZgRAqLE5", + "type": "integer", + "value": 3828673277 + }, + { + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__QGmkfh3gT7U2oUhyavSGq6x4i3qMz1oJcTnui1Wxodw", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__QGmkfh3gT7U2oUhyavSGq6x4i3qMz1oJcTnui1Wxodw", + "type": "integer", + "value": 5284407404 + }, + { + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__bD6dA8xv5Yh4vvY7MVEABy9X2YhKhM6xAZsntiEqj93", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__bD6dA8xv5Yh4vvY7MVEABy9X2YhKhM6xAZsntiEqj93", + "type": "integer", + "value": 3554156418 + }, + { + "key": "%s%s%s__withdrawal__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__8C6PFFdPkyKPhcX6CmmdjdruiRjMfEzsGzFDq6GMLUkn", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__8C6PFFdPkyKPhcX6CmmdjdruiRjMfEzsGzFDq6GMLUkn", + "type": "integer", + "value": 50024613538 + }, + { + "key": "%s%s%s__withdrawal__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__HZY84W5PdvUumEJwK79FJVvFs8EeZZmRxW2oTRy27xWJ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__HZY84W5PdvUumEJwK79FJVvFs8EeZZmRxW2oTRy27xWJ", + "type": "integer", + "value": 75840474800 + }, + { + "key": "%s%s%s__withdrawal__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__HjnPhhgA6ZnaAo7CKM7VictjBpaE5LberDY7n9EbYddY", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__HjnPhhgA6ZnaAo7CKM7VictjBpaE5LberDY7n9EbYddY", + "type": "integer", + "value": 50888078135 + }, + { + "key": "%s%s%s__withdrawal__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__vkx3YymHjBha2FWAKC5PEq8Nq8VcwYyrAfk5khk2dib", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__vkx3YymHjBha2FWAKC5PEq8Nq8VcwYyrAfk5khk2dib", + "type": "integer", + "value": 84664215665 + }, + { + "key": "%s%s%s__withdrawal__3PQhGvLgHdUt4GviS8wX5ZwqAZQPv5mnUoi__HGBV4ro9G3WTUnUynnBWFhrW55NBSU9NgU9ZrHHLLMMX", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQhGvLgHdUt4GviS8wX5ZwqAZQPv5mnUoi__HGBV4ro9G3WTUnUynnBWFhrW55NBSU9NgU9ZrHHLLMMX", + "type": "integer", + "value": 40727194436 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__4Hetgye6J6G2CzJs6QvJyMgrS7LLA8TU6sW1cP36hv6E", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__4Hetgye6J6G2CzJs6QvJyMgrS7LLA8TU6sW1cP36hv6E", + "type": "integer", + "value": 416625275 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__4vSn8c4FPJRmSoUYxfWugH6AgcGqSTWpu8xhegVfuVEK", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__4vSn8c4FPJRmSoUYxfWugH6AgcGqSTWpu8xhegVfuVEK", + "type": "integer", + "value": 302486188 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__62Pk9JSsMn7zra3iR9f2927bC9NTqoiQ6aaYu1V7kdBR", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__62Pk9JSsMn7zra3iR9f2927bC9NTqoiQ6aaYu1V7kdBR", + "type": "integer", + "value": 274219464 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__8Q78hTVQCYi3sS86tPbDLiW2fpVY8BtM6TAcaJkL3ENH", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__8Q78hTVQCYi3sS86tPbDLiW2fpVY8BtM6TAcaJkL3ENH", + "type": "integer", + "value": 200567172 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__9d6f2HV6z9xxm9zY1LBBHALj842T9qcp8m67nVyYrfb5", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__9d6f2HV6z9xxm9zY1LBBHALj842T9qcp8m67nVyYrfb5", + "type": "integer", + "value": 193750156 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__9zf7KkzERyG7wFdRJoNcoFM6AQSgNFdBRVHVJPBLzYH1", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__9zf7KkzERyG7wFdRJoNcoFM6AQSgNFdBRVHVJPBLzYH1", + "type": "integer", + "value": 221712181 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__ADiuX8e2rUukzJ2LJsSyJ8ZXyiqyWHX1A8prHHMJg1Tg", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__ADiuX8e2rUukzJ2LJsSyJ8ZXyiqyWHX1A8prHHMJg1Tg", + "type": "integer", + "value": 225212936 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__AXzYfacF89xP3V1HPJpHtFyWr6NSUSghY5uf4k8i4t2E", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__AXzYfacF89xP3V1HPJpHtFyWr6NSUSghY5uf4k8i4t2E", + "type": "integer", + "value": 239849064 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__DAWXUb2yCRC7skYyB27Bfh9Beg2hJKZWfGu6D2QZjRGC", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__DAWXUb2yCRC7skYyB27Bfh9Beg2hJKZWfGu6D2QZjRGC", + "type": "integer", + "value": 234455985 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__DBnGAbNokVUFEB9ZbeSHT64iMDWEQLQZj2fHkj42SPAi", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__DBnGAbNokVUFEB9ZbeSHT64iMDWEQLQZj2fHkj42SPAi", + "type": "integer", + "value": 243643334 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__ED4xMGmBmtkfrxKubEEmCBDNVDETS3MM7Lg7c16WiZFD", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__ED4xMGmBmtkfrxKubEEmCBDNVDETS3MM7Lg7c16WiZFD", + "type": "integer", + "value": 236765963 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__Ff5SisM2KUuXKEbD1Cw5gxD3z5SHotfYzCPCjbkvYhbX", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__Ff5SisM2KUuXKEbD1Cw5gxD3z5SHotfYzCPCjbkvYhbX", + "type": "integer", + "value": 267838936 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__GCLdGUJH1mBpAUG8ezQnU4NPf6EwMcUPi1XTvEeTHZhR", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__GCLdGUJH1mBpAUG8ezQnU4NPf6EwMcUPi1XTvEeTHZhR", + "type": "integer", + "value": 241810714 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__GLKSzAta5nxi3pcQ1znBbDK2ucK4XtdqiFmwnzQ3cmQ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__GLKSzAta5nxi3pcQ1znBbDK2ucK4XtdqiFmwnzQ3cmQ", + "type": "integer", + "value": 232329835 + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__rf3YcR8sYXFLR4xH7KexyyLFrsrUEWGxZamGtWiVJwG", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__rf3YcR8sYXFLR4xH7KexyyLFrsrUEWGxZamGtWiVJwG", + "type": "integer", + "value": 233290680 + } + ] +} \ No newline at end of file diff --git a/migrations/withdrawals/withdraw_keys_backup.json b/migrations/withdrawals/withdraw_keys_backup.json new file mode 100644 index 0000000..f0f3f9e --- /dev/null +++ b/migrations/withdrawals/withdraw_keys_backup.json @@ -0,0 +1,1947 @@ +[ + { + "key": "%s%s%s__withdrawal__3P27ZRM8NKKxbWCRRUV8gU1BgXjPN9xhae4__2erDnnLXGjMovcD6dtuyGyihNo6brF22PsBHBZ4mNxH3", + "type": "string", + "value": "%s%d%d%s__PENDING__38845806966__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P27ZRM8NKKxbWCRRUV8gU1BgXjPN9xhae4__3f7KgNZFV8abNw8MyWqEtfCF5dj4eQCAi22tfbzjiww3", + "type": "string", + "value": "%s%d%d%s__PENDING__66031407455__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P27ZRM8NKKxbWCRRUV8gU1BgXjPN9xhae4__H9DJRFBe8eVugkjuFo1GQvw5vKeXwWH1vtZnP3Mjr9nN", + "type": "string", + "value": "%s%d%d%s__PENDING__1000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P28abJrxAfRfvS5bkJrptGB1pKjqQpJBRN__HKcjB27v3sKJBTQ7X34diHbMcB6VaQiLJEMkuAGWJ5YP", + "type": "string", + "value": "%s%d%d%s__PENDING__1907328148__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P28givMmcWHShNnediwXnduqRuvURXCNJa__9AkcBpoiE6JWS6kvtN4PggQ2gGrvEFFxyW3hjd5HcA9X", + "type": "string", + "value": "%s%d%d%s__PENDING__5000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P28givMmcWHShNnediwXnduqRuvURXCNJa__EUUHnusTxjxeV9pREp2ZL2pGrd759aXngSChXMeBwPF4", + "type": "string", + "value": "%s%d%d%s__PENDING__1487910528__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P28givMmcWHShNnediwXnduqRuvURXCNJa__FTknmrqxkzLttQMzQgsx4K9B84swKCyrjJnaJnqHgYkz", + "type": "string", + "value": "%s%d%d%s__PENDING__100077726__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P2CehRGv7JNCpS91ksqLwVdtyFz3LZ5y2L__A3TDK7zXCdvQkTPpMFhPVaSENynHfGRJpUsAYkGrMfvE", + "type": "string", + "value": "%s%d%d%s__PENDING__100000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P2FMHavshKyciyu8cHvkVjkwppqXmz7nWm__5hdHLv4mvdkacS2APJpJmDxfx89cbis9ttKMjiV7F1s", + "type": "string", + "value": "%s%d%d%s__PENDING__971000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P2FMHavshKyciyu8cHvkVjkwppqXmz7nWm__BFLgdNULfw4r33pMuJfDG2GhvLwH8BUdssL5rPsZqDpp", + "type": "string", + "value": "%s%d%d%s__PENDING__28481081050__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P2FMHavshKyciyu8cHvkVjkwppqXmz7nWm__Fj76Cw6M3kt8kqQbKLAQMMbZ3W368ZAFTHN2MoHG4VA6", + "type": "string", + "value": "%s%d%d%s__PENDING__1040512831__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P2NgWPbG6QhHX1dTUmdNyEW894Sq5AjTNr__CbPQQX5tL5kUkHDA6uHmdXYkyHL1xsZCj9Vd3WUEUwi5", + "type": "string", + "value": "%s%d%d%s__PENDING__4353272888__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P2NoApfXJWbSL2NsV21ug1CrpU8rnFk88W__9ahnxiQJ8wGmaswMMKakESaS2fEZYDix257ys2CL9Ksv", + "type": "string", + "value": "%s%d%d%s__PENDING__100000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P2NoApfXJWbSL2NsV21ug1CrpU8rnFk88W__F5WhjK27ZuVmezaxZsMWQsP1NwVRAkahf2yG78eC5sMM", + "type": "string", + "value": "%s%d%d%s__PENDING__200000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P2NoApfXJWbSL2NsV21ug1CrpU8rnFk88W__FKtND7XDYE6Cb3yRdk7UmLDNg8CtM9aBgUELm8AD1pvP", + "type": "string", + "value": "%s%d%d%s__PENDING__300000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P2tNimzHmvxd4oyfHzvTHExgVJBaYb1bJr__3fF4NfTiGNbeP9JwyDzpYVR8Efrkk6aAiNDp861SuFix", + "type": "string", + "value": "%s%d%d%s__PENDING__50000000__1__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P339s9WVxF2zGC2ew8NPzjRWbLvyTdqc9n__A7yqU6geUEPSSgaugqPKC5UXAJeumu6eM7Nn2e42sj6v", + "type": "string", + "value": "%s%d%d%s__PENDING__31491902612__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P339s9WVxF2zGC2ew8NPzjRWbLvyTdqc9n__CQkEnTbFrBmHdyoRwUJpy5cWtcsn6PvGA1GftmkZYkbw", + "type": "string", + "value": "%s%d%d%s__PENDING__11755145053__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P33D6UePSWhgdL9PfB9Mm4rVSTJrgV7i47__3263iZubvm3UL7fB8sh1EMUTzacU21NuvvbcyxLSLZKh", + "type": "string", + "value": "%s%d%d%s__PENDING__1899500000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P33D6UePSWhgdL9PfB9Mm4rVSTJrgV7i47__6z7fRSiAGKQ3hXm7AVjqNdvvXnyTrShyJ714ty3edz6d", + "type": "string", + "value": "%s%d%d%s__PENDING__8167850000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P33D6UePSWhgdL9PfB9Mm4rVSTJrgV7i47__HrgqWk2wCVvJVhccFiUKr4AMvgEYQvfXxYPK7dokxfTi", + "type": "string", + "value": "%s%d%d%s__PENDING__1899500000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P33dk2pYeVQiVuA9BCE4mTe1nnamrzeb2A__2w7DogsSbAiuzJMigbbt6CzR6T582w1xR6hXwck5TH9g", + "type": "string", + "value": "%s%d%d%s__PENDING__100000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P3CQeeTztHw3YMdneUZgLoHQ6zvRp1eWpF__3ccw6uEPjMskBSABt4L8k74ytrMzq8o8g4Cs53wpwsYo", + "type": "string", + "value": "%s%d%d%s__PENDING__1583426545__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P3JvkynkGuWCaT9WZ51T1muJdtqrEogxE3__C3UkhbvwQznXVn5yxzpmfZFnPXKxVYtTdsFGqPbeZqD1", + "type": "string", + "value": "%s%d%d%s__PENDING__2510408011__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P3RD3yJW2gQ9dSVwVVDVCQiFWqaLtZcyzH__B9HdgnhgV2yL2FoCT1fyhz2FiHk1iJcd8XfmNCVqN7s3", + "type": "string", + "value": "%s%d%d%s__PENDING__4178900000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P3RD3yJW2gQ9dSVwVVDVCQiFWqaLtZcyzH__Bc5i8BNT7rQ2EEbvesm5r81eo6PfDSJw8Heht91tmnyE", + "type": "string", + "value": "%s%d%d%s__PENDING__13207687500__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P3RD3yJW2gQ9dSVwVVDVCQiFWqaLtZcyzH__EDfeEnDL3NuFmcSbBvGn1TMKWALg4wYQVn9JkFp39oio", + "type": "string", + "value": "%s%d%d%s__PENDING__3419100000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P3aayN8kE6gXo7jSki7WUJHdTAF4X4S9xA__AjArMEkW7J7yZnEH7sopoy2e7QqHToySxMztKHFuzkTf", + "type": "string", + "value": "%s%d%d%s__PENDING__1329650000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P3aayN8kE6gXo7jSki7WUJHdTAF4X4S9xA__CBSiZjDXZVoeRpJA23MDKTrsTuTgv4TU2UTi56civcKD", + "type": "string", + "value": "%s%d%d%s__PENDING__88511237500__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P3qMfjsxSZzED5uCNNCM9bCtc1UqNDLUSM__EsgxeU5D8CJxvmCeuiGaT4HSNb4o6uSd8XKxmMf8H6HY", + "type": "string", + "value": "%s%d%d%s__PENDING__58276590561__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4HvMuStrxyJ2eBzUdFTKvju4mCbELNK7K__9DWHGjocwesKcgvRpU6NaoyiLHEr9e39WQ4GxncTqaoU", + "type": "string", + "value": "%s%d%d%s__PENDING__719003736__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4HvMuStrxyJ2eBzUdFTKvju4mCbELNK7K__BGCF5uhUHCLNG56Ub8hifgYejAe6i46pc1cixFud85zT", + "type": "string", + "value": "%s%d%d%s__PENDING__9020254085__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4HvMuStrxyJ2eBzUdFTKvju4mCbELNK7K__HUdEAPptXXxUeachuZKpG6nit3YyfADZGPqrEfUkxMc4", + "type": "string", + "value": "%s%d%d%s__PENDING__1845176664__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4RLw7ubKWVfgvQ8nRWhNtGxvSJyEw47Np__HZ4WYPXoRnSfmWrYsMx8r7vWeVyp8vTn571WEvXzi7au", + "type": "string", + "value": "%s%d%d%s__PENDING__3988950000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__483h9oBo9UEQ4bt3er93wGirGVwFcKfAGEHXvcifQ69e", + "type": "string", + "value": "%s%d%d%s__PENDING__237725327254__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__4iTmtqNzxDXNfxohUGfjvMMCEZWxjQmW8kwn69gVhaYR", + "type": "string", + "value": "%s%d%d%s__PENDING__97114511603__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__55vJnp6yNfZYTmgmqVh9wcvbuqzG4TzRSYo1epKhPcG", + "type": "string", + "value": "%s%d%d%s__PENDING__26724688656__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__EeCy1WWZbyr3oEawiAnuidYerz471iM3DVF38okPWoJk", + "type": "string", + "value": "%s%d%d%s__PENDING__13275311342__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4SiBokWCPGe2yytWVecaZmyjUEY1sY65p__EtmgouUpzdAVFV4CdHvHRAT9zJfWkCA5QRpzJrNnJWmT", + "type": "string", + "value": "%s%d%d%s__PENDING__41767342725__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4fgnb6jYPE7jC6HvyZDZstWCrmct7X5BF__9wpxySCQyd5eer3u6cgQEvLCnnfZypMwZ5c8sM314gqa", + "type": "string", + "value": "%s%d%d%s__PENDING__48643007215__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4qgN1sXCuxdMP9z4cBftBAyTxtqgqsCqd__4YaTV6dsqEVeMszgmupcpHE7DXkzPirhyGxnRjgH2t7X", + "type": "string", + "value": "%s%d%d%s__PENDING__18879223625__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4qgN1sXCuxdMP9z4cBftBAyTxtqgqsCqd__BLqcYKu6SGcsRB8ucDn9AGtCkPL8Dkyj9xm7KRaQ1cm8", + "type": "string", + "value": "%s%d%d%s__PENDING__20000136473__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4rzwpBUxyLhpoG7CXmLnd3zTYSQ3FBWFA__Fm2qJTT6y1T8kpkxVJaXKQvrYkVc14gZqpNaX2QfZKTL", + "type": "string", + "value": "%s%d%d%s__PENDING__6224395586__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__21zW2eB5Cchr9Jcvy1AkewDg3iNgecsB9MjzxjHQEdoQ", + "type": "string", + "value": "%s%d%d%s__PENDING__3992989593__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__2SuXH9wxe8WqkMiLDPoqVcNRYwXHuGCLqbYVAwkn5HPT", + "type": "string", + "value": "%s%d%d%s__PENDING__1316690440__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__6LyQj6ieZTYgMiYxWwcpyr3S515S1ZRZ8KzRbWG7ppfA", + "type": "string", + "value": "%s%d%d%s__PENDING__199166799__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__9pZ6UX2s9qBtgHHQyageBWNUxwb8jwJ2yX9Fp33docNU", + "type": "string", + "value": "%s%d%d%s__PENDING__389344231__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__EHm5bR2DgGeT9DNwPNw94iAjtmVVR44ryudxmwwvxebc", + "type": "string", + "value": "%s%d%d%s__PENDING__502543115__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__8L3Er4amvWdoou2UJhz87sz6FGD7nwCC5vphJhQPChe2", + "type": "string", + "value": "%s%d%d%s__PENDING__2944225000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__ESGj3Bu6yqyx4HeZhz5RM3WCtGyoueY2hbzKZVqZR6dU", + "type": "string", + "value": "%s%d%d%s__PENDING__13581425029__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__Ehb9mKwL8Vu3cVDTEcU8QjNqjjQKDs8PbJds1fmjRKB9", + "type": "string", + "value": "%s%d%d%s__PENDING__9782425053__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__FBUTJbrTXpTpvJb27iDypdVB4rN9SpQQr9UutnVCfjMv", + "type": "string", + "value": "%s%d%d%s__PENDING__9877400001__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__2MEvJ686WYX7qYWyzrZda2VGj9EbaTMggophFm4Y3WgS", + "type": "string", + "value": "%s%d%d%s__PENDING__2500000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__5U2kshgnejYtJNWfY434YA2fZ4E2dtszkxKuxuemztHF", + "type": "string", + "value": "%s%d%d%s__PENDING__2500000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__5mMbqoSYxF9V2UDx5MJtm6hqsvjkmARY82RyVLFtykVE", + "type": "string", + "value": "%s%d%d%s__PENDING__5000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__CSNkxEjsufhfFbCoBRkikAKjoFUtET2vgxagM13HzPmd", + "type": "string", + "value": "%s%d%d%s__PENDING__10000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P5DW9p3EvAeRksHUAaGy9XSnByWA4Rmtac__EjpHmbEH5sSzPpThRNB5NjgLs5XgY76i3B6cZEHqr9FZ", + "type": "string", + "value": "%s%d%d%s__PENDING__386691907__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P5ExkWasVq9LuvhHnH4mihV1VQPtNWu21N__6fNuurew7EWHYRjCjQX333FqCKdYub7r5TBxbTPTDHtK", + "type": "string", + "value": "%s%d%d%s__PENDING__1414477997__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P5ExkWasVq9LuvhHnH4mihV1VQPtNWu21N__7SCTkCD42Tqnb6ukhwoUQecCZtGzGWeaSVYzYCeYgRgB", + "type": "string", + "value": "%s%d%d%s__PENDING__79009686430__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P5SLaCL3iF2FzrViwtPyuu2ZeoXTnZVExD__HHmLWxxGCDUvtTQzsF1Ndr5M7PSyHxdFmuToB8itdg7R", + "type": "string", + "value": "%s%d%d%s__PENDING__10478125000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P5fDzDn5QnFFYJqwzkijVv2naN3PL9uHGv__2KLy91J2Rem5JyotF78NuwP7LB66WNibE7nHHYUqvrr1", + "type": "string", + "value": "%s%d%d%s__PENDING__84681407662__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__2XxkkiecnXKuz3HAhpFF1ubwPZEhGo2d4HWDSss9zQpG", + "type": "string", + "value": "%s%d%d%s__PENDING__399237098__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__4CgWn3kPZEuFHgDeQPdX7Kc9vuSMzhwpWDC7U9tyMcgj", + "type": "string", + "value": "%s%d%d%s__PENDING__405708067__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__5fnBRLgNwXMQwtUMQm2T5DfUp5UgqFu5MRVpzzdn59Q5", + "type": "string", + "value": "%s%d%d%s__PENDING__452133934__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__5ptTeZ4udFP6CzTpQU55cVWWHc2bD3ZeMHDReSeKnoxy", + "type": "string", + "value": "%s%d%d%s__PENDING__386438843__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__8NHAnPJwrLEuhVkHwJgFJ4xVfvNwjubXAskAGNmA7Lf3", + "type": "string", + "value": "%s%d%d%s__PENDING__289800788__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__BtmM6Czj887fLmaLkN3bzJvNwNxqVh9SdFVB8SEDNJQP", + "type": "string", + "value": "%s%d%d%s__PENDING__2044967239__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__DoW38nhyb9QDPSqiojxAX1YfDG9Pew7VVBW5Ebgkg5im", + "type": "string", + "value": "%s%d%d%s__PENDING__799767551__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64FgRJU1EPEDMdTeSDyWMjDpGiRkBCLcH__9ZRPuw7fGq1tbdT1BrEMsE43Bhas5ffxxe1A4wcJYFi8", + "type": "string", + "value": "%s%d%d%s__PENDING__77729698612__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__27ufGrqNb3MJhQigzNBaF55kJS79L2e5KGNGmXrJRmra", + "type": "string", + "value": "%s%d%d%s__PENDING__812529046__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__56fbD8GAoHQLJdcmb3NW1bhnqBUZBCoe9ckdRtqsAQmx", + "type": "string", + "value": "%s%d%d%s__PENDING__887530143__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__5yVJByChonNrAGiqcjSogz3mLfWkKZ9sdsqba5PKTVbE", + "type": "string", + "value": "%s%d%d%s__PENDING__1625239283__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__7PP4v8Cga13AgTddSJSRPdTj5DrKcfx6YyigMRjkRedZ", + "type": "string", + "value": "%s%d%d%s__PENDING__891089016__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__7muns56cCpjbahT2xqL29MtLFSL8aWAgij7VnEQ4nXFo", + "type": "string", + "value": "%s%d%d%s__PENDING__888735168__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__8DQtD3ah2f8R6ziTN77KcgKBrj5WHD7GCoyFXeTazPGj", + "type": "string", + "value": "%s%d%d%s__PENDING__835592997__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__AYvhQXdKs2wYp4SFR8jK5r29eHUUN6AAGzvg2yjnKH7f", + "type": "string", + "value": "%s%d%d%s__PENDING__232087433__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__B9Tb8meLakqFy1e3a6UKp7nruLu8cHjuUVKVQGCNtKG8", + "type": "string", + "value": "%s%d%d%s__PENDING__870150724__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__BEJLjTHAuai8622RSkDMyk1eK58JxYiMUSd5FPHrwba6", + "type": "string", + "value": "%s%d%d%s__PENDING__975432937__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__Big7gJnGgpgH6zcENjMsxMb5pNLKcyawjk9BtrdqQMjY", + "type": "string", + "value": "%s%d%d%s__PENDING__949167159__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__BprQYizZ5uvVobULnVCpkfkLFXzrjwsEzsQLyRE8SHbg", + "type": "string", + "value": "%s%d%d%s__PENDING__916865073__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__FbNRVDQN6ZPuvMoFQyv5DRE8hRPz9Vub4cRUeuuZcExB", + "type": "string", + "value": "%s%d%d%s__PENDING__904074418__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__GESy939vvVaiE8opgpbpkUofpw4VDnJUvzFnpzRfJXFh", + "type": "string", + "value": "%s%d%d%s__PENDING__889330289__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__HGxVD8vNY1VobYyfntgwckYYSoDyA8xSnW43ZPvr6hRx", + "type": "string", + "value": "%s%d%d%s__PENDING__1027092734__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__J4xA8ddnKrGBU6iYPuK2QcPT5jc9qX1izUsB1vojdJJd", + "type": "string", + "value": "%s%d%d%s__PENDING__951730963__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__JnoWeweTGyCj3DoAKVi5aExrVoZbUqUyMYZp52Fn9Jw", + "type": "string", + "value": "%s%d%d%s__PENDING__1028620019__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6FjQcHZNggULXG8twvbjpsT1sBU8Sh2yv__HnPo6axXmi3eMDRBiq6bdkTXVxymMUW2dWPKHAHdMLom", + "type": "string", + "value": "%s%d%d%s__PENDING__505676149__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6Qdw4cuT9dvTHaHLRJ2iordKyMKJZqUg9__6kPAxnaGt3Gocd66E5bQXtrJdtXC4ohfC4azv2xwBaQR", + "type": "string", + "value": "%s%d%d%s__PENDING__117647058__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6ejmbR3CBAeArTtNbC2WcjjEKHgBbhpif__GFZsfCAM8954GvHuydMKNCYrxJRDaHxUuvK4gkohZMgq", + "type": "string", + "value": "%s%d%d%s__PENDING__115918885__1__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__8gpbhCu8HYNScTsYbvLjkAtedteXAUAAwSK8BxdBhAGY", + "type": "string", + "value": "%s%d%d%s__PENDING__170142172__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__9CZkDQLQ2vh3coEHHDdhCqBDQFEm3FW3GKr4TCQ8rhn7", + "type": "string", + "value": "%s%d%d%s__PENDING__50000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__HdRM9vxYaWQwB5hRLYGVSDbH9BQqwksWcKFAidTv5G2z", + "type": "string", + "value": "%s%d%d%s__PENDING__300000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6hUJtfEgFrRpdYgamDRKHqS6taW49REJ2__6vYZjU2j13VtxV62dQqNqs1CYCjvR9Z4iqGmvWJ2LrES", + "type": "string", + "value": "%s%d%d%s__PENDING__50000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6hUJtfEgFrRpdYgamDRKHqS6taW49REJ2__Dr6Wq5WvLdziMi2R1J2UX5umwG6fYoUN9z34dXw1iy6r", + "type": "string", + "value": "%s%d%d%s__PENDING__61350477191__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__14MNmFNyk2t8KtUHLyk2m91DevYRARjbSZU3eKadrGep", + "type": "string", + "value": "%s%d%d%s__PENDING__11155060__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__2GQ1mJ5pZSEqUTCe7LgkQDZJFh2aHG45eYKVQHbebfsx", + "type": "string", + "value": "%s%d%d%s__PENDING__11607599__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__2NsKDKkrisvyN2T2ErCRz1LPGFEwkqWBg49tLDKa2YRT", + "type": "string", + "value": "%s%d%d%s__PENDING__44720723__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__32Ymhko3cgSembEJZPD5NYwqLYdkPoAJR74cvhctR1Ei", + "type": "string", + "value": "%s%d%d%s__PENDING__11052125__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__39ntEbBKDzgvNTSE7RDMwD3tgdbsERGcKZrJEbwZkZ94", + "type": "string", + "value": "%s%d%d%s__PENDING__11045845__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__3KnZFR3Huyz2uNM6nZ22ocWTt3eLAKhyS8kb8JeVRPNh", + "type": "string", + "value": "%s%d%d%s__PENDING__34312611__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__3wGpq8LHt97qzSkLHPUeuC9sqdaMgTU6rtvPVBoiivXd", + "type": "string", + "value": "%s%d%d%s__PENDING__21617215__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4AhEYv63DtEQyL48rtf4ahPSvvnTVT449ucxcJ9Sgfeh", + "type": "string", + "value": "%s%d%d%s__PENDING__47434526__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4c4ZiETv5DL6HRDstaUCunJv71fHDhYZo8rEr2EFTL29", + "type": "string", + "value": "%s%d%d%s__PENDING__54722187__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4vzMaPsoiGFeMDdQaDyzwWFKwwtf5cJUqf3nG5SaytmZ", + "type": "string", + "value": "%s%d%d%s__PENDING__10550795__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6cw3qwauTRAKEdDZamDRTWAeaDSFsSMXbM6MANG5u9Qq", + "type": "string", + "value": "%s%d%d%s__PENDING__20562038__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6uiY1Z5gqRp7FBn9YBgiKHAFdHg5DXe2on4spNUTFH3j", + "type": "string", + "value": "%s%d%d%s__PENDING__21822738__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6v7C9m3523e4JUNpfKimY9PorWwvL1xQ7HVw4THm48jE", + "type": "string", + "value": "%s%d%d%s__PENDING__10421827__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__77KcZwNsJPV6E73gasL8thDHon5dzwCiYnDnFPGG8Hgs", + "type": "string", + "value": "%s%d%d%s__PENDING__11830993__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__8rgoGNZ4wCHLfJUMPbRVuV81SUtAAauhqxWVB7VnEqD2", + "type": "string", + "value": "%s%d%d%s__PENDING__31445997__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__92Hzny8dLCbs3TLR9sLB4ezWSkiqPLWtPGTEnph8xWq2", + "type": "string", + "value": "%s%d%d%s__PENDING__21383312__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__941zVpEYST1LgBfyT8YUbrZmfwtozkUNwsjV2R43NXz4", + "type": "string", + "value": "%s%d%d%s__PENDING__132474262__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__AHBY2Zc6R1TgZHgJgiWZQxQQxPoR3Btn3XsFWdMoySfj", + "type": "string", + "value": "%s%d%d%s__PENDING__36556671__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__ATHVkJeA2YnRJbzm9hg9BMc8KZUMAXyQxjsyGL33pZSA", + "type": "string", + "value": "%s%d%d%s__PENDING__55109731__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__AWca94muiRNn9ae2r1LSseyJjUXp7ohRiz1RJQF9HMAr", + "type": "string", + "value": "%s%d%d%s__PENDING__11956841__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__At2FQ1WJJfN4p6AjFLvTpkDSZC9g1zPuDW1y251AErWF", + "type": "string", + "value": "%s%d%d%s__PENDING__44673206__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__B85FjvA7iWnFXx7qPX3c5MJmWmR1URixTaqfWmDQsWo7", + "type": "string", + "value": "%s%d%d%s__PENDING__11585113__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__BMKBNv8WiZ5CqbZoUvZndxNmxMNQsxxeVjxedy7geuVs", + "type": "string", + "value": "%s%d%d%s__PENDING__9754716__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__BV4txM2dwUNqYFwF5nMgH2K62iZxoXAdp6fEBk4magv5", + "type": "string", + "value": "%s%d%d%s__PENDING__21146673__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__CA31WHmwpFEzQuPykdivdPuCcdThZX2BRstAXNZeybCQ", + "type": "string", + "value": "%s%d%d%s__PENDING__10882930__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__CYgbjMkMCK5YCGwnP7dpWkjaVKe8aWB4U7BNi9LG9YRT", + "type": "string", + "value": "%s%d%d%s__PENDING__31140432__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Cdq4qBLnViYKzsKhqyB47wADGnS45GYd63r7Ydg79n56", + "type": "string", + "value": "%s%d%d%s__PENDING__32511134__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Cneat15RX9p4WjzAvHqY3AQ1CFLUmmEr6CW76XHKBBwh", + "type": "string", + "value": "%s%d%d%s__PENDING__66369995__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DJXt7fBgBgHt9YCrjFyJJCgx4kzWM4tAPu1oNwBomQZZ", + "type": "string", + "value": "%s%d%d%s__PENDING__21230274__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DXZCNwUeZkk7754bsyrmVMxjrUwsFicGxrkE8GdHcrv5", + "type": "string", + "value": "%s%d%d%s__PENDING__31585209__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DkrEHjfZRsiJ4MFKXLXi7ejkuV9YeLttehRgWGKJuPYx", + "type": "string", + "value": "%s%d%d%s__PENDING__32480652__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__E8HtDHKoVFWtMqTmGGCaDHiwyKnVQDB7dSbMo8Yqn7YU", + "type": "string", + "value": "%s%d%d%s__PENDING__11015396__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__EYZvJcSrGw53UQ5U8h1sN1Qii3kqYMCoGs16gEKbdPPM", + "type": "string", + "value": "%s%d%d%s__PENDING__10679925__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__EnPouN7N3qx8mrHKASvcTmwCBTZ9FnbNHi6GybYh48h9", + "type": "string", + "value": "%s%d%d%s__PENDING__11421728__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Erorejb3kVNiehjmq8WcAmvzkr1VePZ5acc4wqsQsqRx", + "type": "string", + "value": "%s%d%d%s__PENDING__10239135__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FAENNsNDm6qH79hfXWVMLStuqwAxuc9zrYuvyiCXc5TZ", + "type": "string", + "value": "%s%d%d%s__PENDING__10192005__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FFPDUF1XAGWkg5wt9PHbscwZ48ZrGFqYQMmWMxR57s3s", + "type": "string", + "value": "%s%d%d%s__PENDING__10943431__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FKWHB3Q1sQqG65exiD2VFiyFpkt9Hj2mJpmu1xGWuf1V", + "type": "string", + "value": "%s%d%d%s__PENDING__33455112__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FREsEwm5EPC5TZDdE26Fup8Miey2D63HT5DLPBgf8U6y", + "type": "string", + "value": "%s%d%d%s__PENDING__22434911__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FbuJGXB8pWKFc8sudqcfFgQRQFdJbW41ZaZ1vhsn848K", + "type": "string", + "value": "%s%d%d%s__PENDING__22737478__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__GdJrY7AHfc5n6c46fa5gmhP4v8jq7LuVrSuw9njq1pST", + "type": "string", + "value": "%s%d%d%s__PENDING__22299930__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Gs1xvTKNRwtoHHPhFxze1VkbTj5bWWPoU8G4bpe25eWr", + "type": "string", + "value": "%s%d%d%s__PENDING__15842779__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__GzePPYLLxpmc3DEu7sixWi1qxR5fQERrsewcAqwEjt5L", + "type": "string", + "value": "%s%d%d%s__PENDING__12307197__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Hyiz1vqr1XQcBcECFPAagHszFoSSn1YeC6VbzKZBHG8U", + "type": "string", + "value": "%s%d%d%s__PENDING__26720291__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__J8i5eX95KhxbYoH6Mrq69eBmafwQsuFDMNU26u5fGyui", + "type": "string", + "value": "%s%d%d%s__PENDING__11568077__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__vT6ohBw6F6teDKpcPobXrgKbgChbkKUVw37sxma7rnH", + "type": "string", + "value": "%s%d%d%s__PENDING__44845253__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__xz1TtVTA16Y4JvgPuSW94vqytyecMvT8XWyoMadWi33", + "type": "string", + "value": "%s%d%d%s__PENDING__32532051__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6waUhBFADThmgZ9r9ouCrrBG2bUGjdDbU__DBFAumkaXvAFyi3RsVbV1UfkaRFkobCzRtuTgkRPKNsC", + "type": "string", + "value": "%s%d%d%s__PENDING__110138935__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P6waUhBFADThmgZ9r9ouCrrBG2bUGjdDbU__FSgYRp45BGE4jBtdgAFFgHXqnGnNvucBSbpwk3Gs5v71", + "type": "string", + "value": "%s%d%d%s__PENDING__2651628247__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P7LBLiPjMKP1jeRXnp1LvW5dwMTU3AtyBF__BtGFmASgvxCqKRZoA9eHCkxNJu6vjPRAJHbyH8dWcP4b", + "type": "string", + "value": "%s%d%d%s__PENDING__13066160366__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P7X9caDLcngjaAqCjwQjzkgMuVoTKNav72__AKuQopJtmx7etmQTv1a8SCnb6PbXNysHGCpWbWGYoq36", + "type": "string", + "value": "%s%d%d%s__PENDING__94984__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P7mqPfcMt4GeBE1U8gF9jgpCT9T85fSK4f__7pyUvTQWYjxQVJDMeVThCeouMHTTKhq4bBZU5RRJR7bL", + "type": "string", + "value": "%s%d%d%s__PENDING__100000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P83kwB2C5GmH7D1z1cwdjDMLvF4FZyhxZf__GcKq28ZCMrGqS5k29QEFpGxbwLssuUKQk8ydGQmqrLaH", + "type": "string", + "value": "%s%d%d%s__PENDING__14535961556__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P8bxPavni6rQjNXWFnP6Xw68Bb8gyAB3pb__AbhrfsEnNPKNNfd4UK7Vapi5Hu87HiJmuHYnSHcQZa1E", + "type": "string", + "value": "%s%d%d%s__PENDING__200576587496__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P8hEMtF3exJMnDSBUcAYF1mcCZg421nM8h__9EJnwzhRVjS7uysxeWkkSVYDVvpTk9AA9uGNg1jeQEk2", + "type": "string", + "value": "%s%d%d%s__PENDING__2849250000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P8hEMtF3exJMnDSBUcAYF1mcCZg421nM8h__AuLEZj1gAL8b1F6G6sYmL7oV6SMtY9LbQota5ytctrXZ", + "type": "string", + "value": "%s%d%d%s__PENDING__7598000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__14k6HsyPZFyxdqrM7BUcaxKYzTp7ViaMemcMDzZLGhed", + "type": "string", + "value": "%s%d%d%s__PENDING__545743672__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__2LbVFLoUhdppZpgUwy9MJ3ZMAtqHK7CsUd3To987xuFR", + "type": "string", + "value": "%s%d%d%s__PENDING__617266276__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__3ATn6AGyCf5kh8dYPe3rgDLkbatAeCaK32rSZGb9Yw8N", + "type": "string", + "value": "%s%d%d%s__PENDING__614580696__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__4hfg1R9waj1cAfEi6eRJPPvravNPCwA9G199SsS5qzwu", + "type": "string", + "value": "%s%d%d%s__PENDING__1028778611__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__6Cmf6GdFMdj7AAuDxgKvG27XTgqZULGhqL43TyFDMpTX", + "type": "string", + "value": "%s%d%d%s__PENDING__599590253__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__6QN2kXp4tvvTqP4JvUFygnmEWtKUkNnzfYVBKKXBuotT", + "type": "string", + "value": "%s%d%d%s__PENDING__560637495__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__7eHuVPzsHNwxApvoSNAQKZChnSfLimYEHePGxanQKuLd", + "type": "string", + "value": "%s%d%d%s__PENDING__146163206__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__9EgrGotLuM1Y32r5vp6EWKG5XCNNhvM8EG376J9TG83y", + "type": "string", + "value": "%s%d%d%s__PENDING__579915894__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__ACRqSLFin8iJCK9Qw7KK3zKqb1EPm2UDB4pjgxe3wNzo", + "type": "string", + "value": "%s%d%d%s__PENDING__580103147__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BDcbyemFLsjUuRFCMUAqwE7xGC7LaM879e6Gn9Npufyw", + "type": "string", + "value": "%s%d%d%s__PENDING__658998488__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BV2WxGM3pKyZEttzGttTNP2dbTnJSF7T2L5pXCZoDG6g", + "type": "string", + "value": "%s%d%d%s__PENDING__637796002__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BeKUdUbavZxd1AtsvCMCEARDxPYHGS8Qz3XjSsq3umQ4", + "type": "string", + "value": "%s%d%d%s__PENDING__609803464__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__CbV1yHxfd6Ph9H4pHzFkFn71J5VFdhxjNaSuWYiRZmpA", + "type": "string", + "value": "%s%d%d%s__PENDING__569210696__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__E8NRAF2Rur5f8SbxVBRpdEDioMANTxwuuKvLKD9WP2CN", + "type": "string", + "value": "%s%d%d%s__PENDING__590049936__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__Gg3imMpwEf1LcR14hpeBXBEAsNiznVLpKJu85HfqcsZs", + "type": "string", + "value": "%s%d%d%s__PENDING__597180780__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__GxMdqYaQDJp9exxvHzGoVXATu8jjzZjaPvqC5W112FkA", + "type": "string", + "value": "%s%d%d%s__PENDING__568871116__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PA65ZA2Cgu9jPJA3jS1Z4jxpZspxYAhevJ__2nL63FSg5rS7iZtwevPaM5q5zEhDAXA2XhmVTywxv2EJ", + "type": "string", + "value": "%s%d%d%s__PENDING__575712232118__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PA65ZA2Cgu9jPJA3jS1Z4jxpZspxYAhevJ__DHccWbLzSVZSEmsnQRB1QvLKSs9cMM1xdoRpDatPTdqJ", + "type": "string", + "value": "%s%d%d%s__PENDING__239494425__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PAeLTZwJtvRWweZM4M9Jt2V4dVtTpXBCEK__8mjBv5gMedtUSCFnGVecBksdTkPckoDghHAeLsDC9SvF", + "type": "string", + "value": "%s%d%d%s__PENDING__4514259699__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__2KEK7eXFWHMBL4nJgh2SndecdG57aFdGDPGbBc4ACNGM", + "type": "string", + "value": "%s%d%d%s__PENDING__2469350000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__8wkThDGqFhWVuAtbNGQQPhJHPfKj8h1iiR6Kgu5HCryg", + "type": "string", + "value": "%s%d%d%s__PENDING__33204150000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__J8oh5hmM2U7B5Pwzjq4NLLpdN5BgmpVEBizKgTUesbBx", + "type": "string", + "value": "%s%d%d%s__PENDING__9877400000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PAuU9oc5YmkoHnb4KQMCkxn9ebsykynBCH__3y7ki2i4hvmw675QPH7pG5m5dWoZUcDGvoaRizX67PRH", + "type": "string", + "value": "%s%d%d%s__PENDING__10000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PBVqECkRHz87gJRZpn7oyhFWjZF9vcDcsR__FNAp4dQfrcdRq4fCeQTwgRJbo8xrLarva9HPZttwmTVB", + "type": "string", + "value": "%s%d%d%s__PENDING__90000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PBbYtxa4fW8GM5xpqqCP4jyZmCwsNFoe5P__GZMEGN138VLKKzbijnx9HjpVvXCuj28xqVa6JFvpHqms", + "type": "string", + "value": "%s%d%d%s__PENDING__6215937909__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PBitcoinAVGJvpSe6jevepPbT3M8SoMZjb__D4sr8JiTHeMZ1dgvc4ubG8U26Vf7sQ3d6x7LuVEawDFY", + "type": "string", + "value": "%s%d%d%s__PENDING__4159587500__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PCLkgzwEY71DDLtkPYAs1gsbbJoqmiqn62__2waf3wGnXM8h7fEJ9iWS5mcczeLj6e6gDWRA8ZALN7mC", + "type": "string", + "value": "%s%d%d%s__PENDING__11621912872__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PCLkgzwEY71DDLtkPYAs1gsbbJoqmiqn62__4BMq52B44fjuFLR2GXrmmY8F7FnqXE3HCaF2Vx8EUrMh", + "type": "string", + "value": "%s%d%d%s__PENDING__2817361866__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PCQiEJsERrUyrVV2551MNs4eSDAhgQg5e4__4YRqUYuVZaBNPi9ekTHaVWgpox72qmUZk9bRq41WL7u7", + "type": "string", + "value": "%s%d%d%s__PENDING__2647861143__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PCRRYmirzTXmLZ9R2peoxYD4AugayNAizG__3KHFpr16VcnwNvs1E5ygi1pgEmdqQw17bwkeCDosQow4", + "type": "string", + "value": "%s%d%d%s__PENDING__683944419__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PCRRYmirzTXmLZ9R2peoxYD4AugayNAizG__D9JX8EZ6gJiEei1FD5BvKihbfctDEWDvmvZ4KqAsR39A", + "type": "string", + "value": "%s%d%d%s__PENDING__616679837__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PCoDJZ4R95qFdiAwdhjf9y2jtTiskJ9STo__9BfbSk8Eo9tA5rdgyJ6RYKDhyrGqZktvX5ngfbSF7oqs", + "type": "string", + "value": "%s%d%d%s__PENDING__100000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__4S8g9z2F5PVRxmtgcbdqmg6izegibcatZnfqT2VniJFM", + "type": "string", + "value": "%s%d%d%s__PENDING__135679809__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__8Y66uDT4Rh68nCaU3WP2nsou6aMKDeBzJLWxqmjUsSbh", + "type": "string", + "value": "%s%d%d%s__PENDING__100305841227__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__Abybzx4zoTJfPBhN1m3wasqDBoAzhcMpQHz4fHPAgCEM", + "type": "string", + "value": "%s%d%d%s__PENDING__241963368500__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__C27WZcwp3pxELD2Ejf3io8MyTKbbaDEi1vLMWoFVAUuc", + "type": "string", + "value": "%s%d%d%s__PENDING__5655047__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__D4y1MHEJcjs1DAjGr1JfsYrn5SRP9f9uCr7RE8khJ6Z2", + "type": "string", + "value": "%s%d%d%s__PENDING__317319860034__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__GJhJWKZMRqbxq1J4eaz4WW2ua7qqh1FhDRuGxo7kRcH", + "type": "string", + "value": "%s%d%d%s__PENDING__1413740__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PCwtPsA4s2fyZrYs8A9QS2SgUr1Xe9qriV__AVeQzWSiEN7kGx23ycUg6rX4LdMZGDuLkY4rMrEsgHUr", + "type": "string", + "value": "%s%d%d%s__PENDING__86870275__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PCyijL9g2TTJ5uJogVW2sdgMjPoRH7xNZX__5stqqR15Ka98hKBE8gmV1SUkrFJc1RRRK9mPH7CHsV4m", + "type": "string", + "value": "%s%d%d%s__PENDING__256014683952__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PDMAiABRewTdMeNnGuVC3mWG7tQVuBWzYn__3cczdjKSoAY545hpRCJMZE6cBE9ZXgnMR7v6328rk7Fe", + "type": "string", + "value": "%s%d%d%s__PENDING__4125527466__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__4ZrPeEdaCcXzs1aZbZwHcFDR2zggEPwPgRodhbjNS2Va", + "type": "string", + "value": "%s%d%d%s__PENDING__1980251476__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__9Ze41pWqASikNqK8RFubn9BWqxYWSTBqyehfak2EFvNL", + "type": "string", + "value": "%s%d%d%s__PENDING__1000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__C2YYEP7Ps8TiCrAgPZNJZJzYJLJSyi8CEExxVWRTcGkB", + "type": "string", + "value": "%s%d%d%s__PENDING__1582817293__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__DJ5UzyYyqC8RQfWom26X8Qmn89Sb973Q9EmFpQkhvbsc", + "type": "string", + "value": "%s%d%d%s__PENDING__289722509__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__EH98Fiaw6ZyTFogRBBUupuNhcGP5vgrGbE5ZRPR4KKWH", + "type": "string", + "value": "%s%d%d%s__PENDING__6427446837__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__EHvc7Q343pBwRgC9q7q3VoGuag2n4sHgkBzycoZY2cfj", + "type": "string", + "value": "%s%d%d%s__PENDING__665445343__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__Gza8TnPt4kKST5jCn3LLG3SdL8KDjTxmhHpfWVy7t6f7", + "type": "string", + "value": "%s%d%d%s__PENDING__1500000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__HFf32TnGQUXEhX2VxebBiiwT4ZTkEwhaksGKnZAsHMdc", + "type": "string", + "value": "%s%d%d%s__PENDING__1000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__Hj3d2nM1FYRCViPnRpPN76VWDgSoh2YueWjZ7soi1iys", + "type": "string", + "value": "%s%d%d%s__PENDING__2107514993__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__ak4a7Gba2S2WN27ddWkXJa8HzaKtiojiX8rqeVBDpto", + "type": "string", + "value": "%s%d%d%s__PENDING__3000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PDRLD37a7qwABsxiKgfpJeqUt5CuSjetLL__HPMkfvfLYwy95G2uSyc1AQSdq6eC1bxBbbgzC3JDevSv", + "type": "string", + "value": "%s%d%d%s__PENDING__8668503954__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PDdkNJqhKGJNTHdqJbJrtKgQsoCgDHhMoZ__7j9fzhwDCR15DmzPCxLYRUBo8NyLDdQsF4PwKRSDNXfi", + "type": "string", + "value": "%s%d%d%s__PENDING__202048988016__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PDyGuhrKsitcBJHJg1fviJQ4NoFFm3AR3j__13zpZkbR9BphAjNYLBrFhS8JjpFLcNcZq7jnDrDQeSSc", + "type": "string", + "value": "%s%d%d%s__PENDING__5498421__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PE6zfGg6yYimCXnNZzNZcCvuzRM719PGwm__4EkYEvEcN9VcNMybZyBvguS6VvezrFCCkWPFswEjMTyR", + "type": "string", + "value": "%s%d%d%s__PENDING__134808490__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PEF7boounYGF8y8A7QvQWsA3ZFoxR51uum__72xdJk2bKS7GAGQ4xQCe2ReujrFZKpiZzMoB37m95Yb5", + "type": "string", + "value": "%s%d%d%s__PENDING__55255475__1__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PEM8TcwGMAmpSLA4tUkNRD1bsP7a62aAMS__2zMfat2vvXzUmirwoWhrLc1fCyh5irNtu98HbZsUzX3Q", + "type": "string", + "value": "%s%d%d%s__PENDING__3600000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__2ZkpVAX7ysR429RuQZY7SFjepidyMwmLvvTfvFXRWCsQ", + "type": "string", + "value": "%s%d%d%s__PENDING__119374108__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__6ugq8QJRNCVa2vqR7mJqJyQmDFfz81CDQ91vQ4GmsAtE", + "type": "string", + "value": "%s%d%d%s__PENDING__101620720__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__Bd6fU5Fg4P7gubju9n9y6ACMyypUprcteTFG4Kxq7nyJ", + "type": "string", + "value": "%s%d%d%s__PENDING__122677482__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__BmJ9thNrMFKFwrp1W1tfcTWa4bsRUt2KpXgPgMuBL243", + "type": "string", + "value": "%s%d%d%s__PENDING__111226036__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__E3ffqUgHVotYp3HcrrXpiDpSFPWrBpmqw8miNg2nbzBQ", + "type": "string", + "value": "%s%d%d%s__PENDING__111708069__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__EUJtrBxYzJGP515pnusTccY3J4arifdvpN6NLJPfPBBG", + "type": "string", + "value": "%s%d%d%s__PENDING__314031850__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__GAkPWdf1mPCBBAMHt5db9fKeTspeZzKRPAxyzhxTj1aY", + "type": "string", + "value": "%s%d%d%s__PENDING__105090202__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__HC9jRsRT5JSdVLgQjPY3CWT11qTjEsWxFQ6aCnniK5Ze", + "type": "string", + "value": "%s%d%d%s__PENDING__451928553__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__Hph1x3qXsst2ysXko9Mecq1qhB6WvaSrSb4VmBaAYQrk", + "type": "string", + "value": "%s%d%d%s__PENDING__265607223__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__HsqjcoHQzUtSC6Nf3WsW4fD8G5HsurTs6mwGJxNS1AzC", + "type": "string", + "value": "%s%d%d%s__PENDING__81391103__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PEbmcoRgzuf6W67XFqn6rm9PKU744H8PGG__AWZjFnDT9hJDPUwsvf3azouBZ1ipJymNMfTNJRtwGjpB", + "type": "string", + "value": "%s%d%d%s__PENDING__58558547__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PEbpUKHrLw4y5uLie6QEtsAS74TC5CRMLb__E5LBHGLTGgVc5hj8TviwwebHjjE9LCv6unw7QXkRJwao", + "type": "string", + "value": "%s%d%d%s__PENDING__2528864617__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__CXhPZTuuWrv4SYAXnUSDGXgQd4Rjt28e32GVgn9SUg1n", + "type": "string", + "value": "%s%d%d%s__PENDING__3743476274__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__DkceM4tfugUJ9HVVYwtt9VyvKhTAm1YVYSivMZTViKAE", + "type": "string", + "value": "%s%d%d%s__PENDING__41878551773__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__GzDQVuTc8sG2g6CRGCzTNus9kWujuGf3kYViYG9z98k", + "type": "string", + "value": "%s%d%d%s__PENDING__9366361994__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__26cjFAYWH8Y24P5QN3JmCboRHwGCB1dNjWHZDsSTrUDr", + "type": "string", + "value": "%s%d%d%s__PENDING__532785065__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__4jzbvZVYeGyAfv76RNmXUky1To35Wr3BfCKsksaxoRBU", + "type": "string", + "value": "%s%d%d%s__PENDING__675671991__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__7RMh7WmnsDa1JcGTuCz6JWjzp9t1sGW4uSqNdEY6yyQo", + "type": "string", + "value": "%s%d%d%s__PENDING__584077704__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__BQ5EWuQMfwM2NB5pEoKtGhaSPQCvbXv6h3fpLpdDmDd8", + "type": "string", + "value": "%s%d%d%s__PENDING__1114711917__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__Bt5sDSNhd6A7WkS4jYRZieJQiguYSme9edhrna54gKc8", + "type": "string", + "value": "%s%d%d%s__PENDING__718465948__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__Fpdr8dFVNc7DRGFgG7dc2CkdMSBXFM381YPP4fiWrxrj", + "type": "string", + "value": "%s%d%d%s__PENDING__445181522__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PF2RKwvJ4Cq45mEtSbG7trbU3yJ2ynZfVu__AejckCY2gxT1o7TnuQ7cFW2mqKQgqzFmKXgpzMG7GKc", + "type": "string", + "value": "%s%d%d%s__PENDING__983457060__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PF6HUACCxujjSbdxtUzPuwbQUjXQd4eqF2__DGm1La5bR2Mpo1skkcxXyWErDSKQRUZwLvk8NAWYWjZt", + "type": "string", + "value": "%s%d%d%s__PENDING__28602982006__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__2pyjMwQx7T1LiWdrw4huDdYbGga3rcaK1n9MDba5yEnW", + "type": "string", + "value": "%s%d%d%s__PENDING__37716698183__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__EiGNbkvVnEHPUHmiZS3tk4VbupTZnLt6Cfot6i7zoToF", + "type": "string", + "value": "%s%d%d%s__PENDING__27500000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__GJ6evDKg13d84WYbLiFHHpxnjdK17U3zVZmFjiEXWu7d", + "type": "string", + "value": "%s%d%d%s__PENDING__19425217483__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFDVSLtgPpPxiFHsUxxkv7NvyCuRSDHBc3__5znpEMbF6XVjjBoaFe7N59evehdu596qTpiDapCj8u8", + "type": "string", + "value": "%s%d%d%s__PENDING__1329650000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__21pzAUwcSzei1tNRnDgbCK3DVF5SGycbgkhrCFrLN2rC", + "type": "string", + "value": "%s%d%d%s__PENDING__853395178__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__4WKe5SVgEKrCZexAT3iUkDqWWcTbaENsC5HwSK4ZTLhF", + "type": "string", + "value": "%s%d%d%s__PENDING__948221917__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__5pQH4TWKJvruXuwNpHDcYpQk34wHUNVUHTcaYyDmZzFG", + "type": "string", + "value": "%s%d%d%s__PENDING__836139448__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__7fvT8A1jzLFM3h1EJjhAvS4KLa3eLkJMoGKdusXV6MsD", + "type": "string", + "value": "%s%d%d%s__PENDING__2447716766__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__7qfu5uNDVj8jYLVMQs3fuGDLDvTAWzVicgJeFDPLiZXy", + "type": "string", + "value": "%s%d%d%s__PENDING__5040352822__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__8VboUZtkyb1p3EYbGsQmRFYcnpCLHuTKSu24662jjHDw", + "type": "string", + "value": "%s%d%d%s__PENDING__5368497816__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__8keoiqVV7CFH1uaXcDsEZhbQWpHb7ivG6LmU55zKDeTZ", + "type": "string", + "value": "%s%d%d%s__PENDING__877626342__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__9Vib76kWbBpFEVx4ZQFAaspJpvc5Zsd7RgCU3zt5KUCb", + "type": "string", + "value": "%s%d%d%s__PENDING__952908378__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__CAhRoF7KXd7cDnXk31yvUYekJPjYqE7HdnM7EB3iKehV", + "type": "string", + "value": "%s%d%d%s__PENDING__818033805__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__Cwi2Zp5H8ZkV1oDJ5jnKnWmRXJbfAjdyU6TV5JtontvP", + "type": "string", + "value": "%s%d%d%s__PENDING__6971318575__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__EcnS5iicxCTMmmHsgvPnkjh85EkXidcLcvE5goSeRMkr", + "type": "string", + "value": "%s%d%d%s__PENDING__1041600762__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__F8rSHY3yNMMYY8XkBh8QSC1HyVsNMAFnqXZgk5wDEAuw", + "type": "string", + "value": "%s%d%d%s__PENDING__895971095__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__HsPbzuB3n9RR4xfeJustcUWhJ6jff9WTkPZL4jR1sDwM", + "type": "string", + "value": "%s%d%d%s__PENDING__969197240__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__wxp9E9tEpd4mncxTFSkqbXY9A1TppF2Ke51JFpkVjnT", + "type": "string", + "value": "%s%d%d%s__PENDING__991072029__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFvxLPUxCY9Et5uyfkYLE4SDZ5oJTCFWsG__86yvd4JHwPtS322ZEkV6B4HCs6L9jYDWukT47FjuYDJX", + "type": "string", + "value": "%s%d%d%s__PENDING__100000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFvxLPUxCY9Et5uyfkYLE4SDZ5oJTCFWsG__DEAxHFsgHCWipYK6NB5HndRrJqQrMHML37QEp8FkeC23", + "type": "string", + "value": "%s%d%d%s__PENDING__47466546112__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFwm8UvcfcFUMLsxN2W3djtBgB1SPNBqRL__6rkkLvj7wMEGAH9LaK5m3dtdu3aYw1d6sWFWfQ9SbN4q", + "type": "string", + "value": "%s%d%d%s__PENDING__4000000000__1__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFwm8UvcfcFUMLsxN2W3djtBgB1SPNBqRL__8ESBwLfuPzVx4ZACEKvMQ1RsMxLoYdqzWvyH4G462vuc", + "type": "string", + "value": "%s%d%d%s__PENDING__27000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PFwyK4WEDb2qQ1wPFxG5rzyz7x2G1byMXz__Cm5btuYg9pPpVBz3ZuetVnmhWwU4jcycBVPKu81gJUL4", + "type": "string", + "value": "%s%d%d%s__PENDING__10000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PGDywXYEdWACTs8rksuX9dxS3uGoWQpPyb__9z8Av1yEvy3PSAiqJ2xEG17RMf1zRYsYUQg5CMyrkRg7", + "type": "string", + "value": "%s%d%d%s__PENDING__5000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__2YkRHtvmKRomGUWcLiSufyYkmaRKFjpDzm731PZ5Ca96", + "type": "string", + "value": "%s%d%d%s__PENDING__5180026163__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__2g3B8qVqV78FTTjmEZCofGQrA8e4PzayW21BhJ7aF4Se", + "type": "string", + "value": "%s%d%d%s__PENDING__9106976438__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__HaudTBcz2gJrEMgafNNDHJtZWWAKFigXukU6hR2a11gf", + "type": "string", + "value": "%s%d%d%s__PENDING__10000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PGfXB5bEz7EkbtGMNUYop5aior5X6bUbvL__E3dhm3skoxPa8Pf1tt7Vai8ofmptVTDn7ngwzyEYXQcQ", + "type": "string", + "value": "%s%d%d%s__PENDING__23598235634__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PH152STC5wrrSfAzzFerES8fSZaDXjvGHN__MeUeMVfgkCLzBH5fYfaExCxq6VXcniyNuxoq7fnEHhy", + "type": "string", + "value": "%s%d%d%s__PENDING__1885035978__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PH3K5hyTYgM7Knt4vaXb9vbYZUABJQAFse__fmCRyZEiZyh74rFFvKs5piprrHrkvKhpxpZkEkfjCYC", + "type": "string", + "value": "%s%d%d%s__PENDING__154089136376__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ__6y3o7fQZhi6kfyGPsbKpqK74tEGNBzf4Sb15LQfkJEaX", + "type": "string", + "value": "%s%d%d%s__PENDING__25461374__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ__7sPzPdB2sCu7K2xK7est4NrBqCXjkKq3oiVE6j3Xspft", + "type": "string", + "value": "%s%d%d%s__PENDING__100011502579__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PHvG6exQVNMLfNKY61F7EdPz5ByadQMstu__HfBo5aXhynH5G5N6QS9edxaPD5upjUFcM1Mr9Dewwwww", + "type": "string", + "value": "%s%d%d%s__PENDING__124206166__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PJ4dDgEyksWRdDBrZkCjFrURTcGCk7WN1c__CNJtg4SKiRtYHCUtFqcL6McFEwivbTM8w1QvnSNdHBMC", + "type": "string", + "value": "%s%d%d%s__PENDING__13284185188__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PJNxRGLG5wuuqcVjn7uviv4qaLfuq75xLH__4cdedswSNyVkYp3uYLk2wcTNgUtdsWh2qg5SPMNuTtrJ", + "type": "string", + "value": "%s%d%d%s__PENDING__24517194__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PJNxRGLG5wuuqcVjn7uviv4qaLfuq75xLH__7V2PYFFNc6TE4qpLqKREEqucSTSVVbdHy8yFj7Gvtq1a", + "type": "string", + "value": "%s%d%d%s__PENDING__29861169__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__4knQr5WwBKxWKCQ1MpwzdPrnT255AXsS7jdDK8x6YT5T", + "type": "string", + "value": "%s%d%d%s__PENDING__6188870786__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__6v6ePQu3PnXEMAigcgekbSCsvA4KiTGqnVtwByAwSZKM", + "type": "string", + "value": "%s%d%d%s__PENDING__82025420216__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__8NgLkdidMJmkTjrPxmEJ6i3MkKHBYxdHYRwCvfYhvAZq", + "type": "string", + "value": "%s%d%d%s__PENDING__38636714359__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__CyVzTbazC9Vc2VU74icsethm8boSi2oSXMM6hnox5B7y", + "type": "string", + "value": "%s%d%d%s__PENDING__5518279136__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PJgDho14MN1ueX7D1kp2XJ3McggppfdQeT__38iTvkJJGpmAGwfk9rq5NsjUfhkbmhzvVwBWdFuz51z1", + "type": "string", + "value": "%s%d%d%s__PENDING__2279400001__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PJgDho14MN1ueX7D1kp2XJ3McggppfdQeT__CKEtuKLzyAHPXYWVtkynKwoXRYFoKvYRN8PHE3ZuY1zj", + "type": "string", + "value": "%s%d%d%s__PENDING__189950000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PJjnz3z24vwDResuNo4Bgth1rYRre267qj__ChmdhRHtUmM7rRhtBPEgzHWQMUNfcdWhpCLr3ZsD2cuL", + "type": "string", + "value": "%s%d%d%s__PENDING__504850444__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PJjnz3z24vwDResuNo4Bgth1rYRre267qj__nmwa4843duu5nYoST9vouGKa8y4HwqAc12T3jHhPYB8", + "type": "string", + "value": "%s%d%d%s__PENDING__1057278448__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PJmNd7oXYHqDD92xYH4f6zxNxEV45togP3__4fUGeVxgWtHgqXLkEYhnKWGsNWciAfhieUSUnBfckkZZ", + "type": "string", + "value": "%s%d%d%s__PENDING__1000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PJqcYDtN8RFLWoJCSosrxjTptgV9JFnQtp__DCffPCZfZ6crHWQrP8WH3a1cCQv6AzTNSpLxZCRV4iej", + "type": "string", + "value": "%s%d%d%s__PENDING__2212261405__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PK8PvRf4Zdh893ntCTYSSGdSWaoKB4PUr3__9uK84Q6PvCgVdL2QXx4i5WRxXtVRv9eiwTk3Vbs9hxGM", + "type": "string", + "value": "%s%d%d%s__PENDING__124545050__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PLBFxFwMgTNPptA8RnygTpPYazoWeSf3BS__5vcyoTeY7MtjDbD4YquDzdghqxbYBiznzQGtrTmLaYYf", + "type": "string", + "value": "%s%d%d%s__PENDING__5131396987__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PLBFxFwMgTNPptA8RnygTpPYazoWeSf3BS__FmjNfBKycYTU9USTmyEVnToNanKdpBqzM4ShShvG8vi5", + "type": "string", + "value": "%s%d%d%s__PENDING__2214188025__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PLTWcc26QWMkrmRvYqBkn6hTfwpmGRXTun__6HXFMAMEPXWXRToG6NTUYdYNCtjVhGjzgRRcLdqoJm8Q", + "type": "string", + "value": "%s%d%d%s__PENDING__11491448494__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PLTWcc26QWMkrmRvYqBkn6hTfwpmGRXTun__8EiiCbEB81B4nGb275pD469tdUmmwqtHTeGGv9mWnUKi", + "type": "string", + "value": "%s%d%d%s__PENDING__9005898638__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PLfnQ8fCS2nyFdUh2Fmp8dJN7fs69jAhA5__8bN6rSyBPkX1QdKMEnNhkCRCWNZKVhnYJuxqMCn6G2iJ", + "type": "string", + "value": "%s%d%d%s__PENDING__21219694522__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PLfnQ8fCS2nyFdUh2Fmp8dJN7fs69jAhA5__GduqkYkLFpt7Y1BncCJMViiTH3ojdqbVKHzTuSEdZHFE", + "type": "string", + "value": "%s%d%d%s__PENDING__100000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__AkGRx1V9ojAux2getmZRRdUn23n89KKsmstVwcAGAuZb", + "type": "string", + "value": "%s%d%d%s__PENDING__1104595300__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__H3wvP5J2x4iJbjNaJbJQjHm4MKAE4CLaVbVnG4HEgRHp", + "type": "string", + "value": "%s%d%d%s__PENDING__22024474326__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__d6EnCTDD2hwDfmLiEq13yZoEo8n5JsjxhMybwdMuYNt", + "type": "string", + "value": "%s%d%d%s__PENDING__10247942923__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMdqvU8tP5zBi4wEEFpaoNmvwXoqkkyYQS__HiAFnb8esSwj77Abn3LZjS5PiFnfi2QmPVyCwv2KJawb", + "type": "string", + "value": "%s%d%d%s__PENDING__10640600586__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__5Qtp38JZfnJnoAmu6ADLGKcYwi9aDLmMVUQZYe7rhaai", + "type": "string", + "value": "%s%d%d%s__PENDING__50100000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__5idixthp7izdiGwG3ua26epBvYqAYV7zQqZwghDFZHKy", + "type": "string", + "value": "%s%d%d%s__PENDING__10000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__6Bb76YoswJGwC61ztQLCU3hprSEXMtFC11sXYHvJG2dG", + "type": "string", + "value": "%s%d%d%s__PENDING__10000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__7fTFc6DDvN4Mn3G9JWEmyPpYqwzARbipDDMRyEsWcgkC", + "type": "string", + "value": "%s%d%d%s__PENDING__1000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__A6vsyPJcHey5kUsFud5yesGGZGkQ4XXRQ63jf3XKdZHH", + "type": "string", + "value": "%s%d%d%s__PENDING__100000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__BsQM5CxBt9EtKxK33UnvhHM9AKebhgz2XVLed3r8LTDS", + "type": "string", + "value": "%s%d%d%s__PENDING__1000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__EpJ7YWwgQc6HSdPWJqHyaEfWbZx6Upi1Ym1NUPNnQQVR", + "type": "string", + "value": "%s%d%d%s__PENDING__300000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__Er8WrcbpbuCUfTdXyu8268nTvosKADinLtmDASuPny2E", + "type": "string", + "value": "%s%d%d%s__PENDING__57900000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__FMCisHCSp1kHs4F4S2ERE8arTWM19X2NHK4tHKxkJwjf", + "type": "string", + "value": "%s%d%d%s__PENDING__100000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__HQG8EFhSgCewE6GTX6xQxZyxRBX9TPoZjqbaTXAEJgQ1", + "type": "string", + "value": "%s%d%d%s__PENDING__50000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__gTcfTtexav7mMB1vfLRZpZDCGYteh9PtUM2oAH5r9xD", + "type": "string", + "value": "%s%d%d%s__PENDING__11318283824__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__2HG1fz3cjhudSbQsopmybexvZFCDP2uUqEabjCW5qbVT", + "type": "string", + "value": "%s%d%d%s__PENDING__1372000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__5Jpai82zXxZwPRPWZ6A1h7xHdHJppMM59FAz9FCdUGr3", + "type": "string", + "value": "%s%d%d%s__PENDING__1707615511__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__5cXxKQpeUzwsB7awHRaXd9WdAomHjn5BX3P4MJR8rHhK", + "type": "string", + "value": "%s%d%d%s__PENDING__1500000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__6YRPZqJ4akuMkwJxc5H5RnPD9Fk7oZSJY5nxvacyibbF", + "type": "string", + "value": "%s%d%d%s__PENDING__1662107678__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__7mRDLhhRGKeTaDcn58zKmVACvZhUZXmL4rdi5JKX5QZF", + "type": "string", + "value": "%s%d%d%s__PENDING__985541647__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__8YtcxL6tQ9oJ6f7tZ8Yz7HLdgKzEHMrQ4E7zgz5Nfgm7", + "type": "string", + "value": "%s%d%d%s__PENDING__1578268987__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__9b6dXskPLQUsAJa4dSBusgczRFYBVHG5k3fC5jrhgCNd", + "type": "string", + "value": "%s%d%d%s__PENDING__6612359551__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__C1bbtiktW93mhKw59EcjXVfjqd2yYa1vp2LjabfLCees", + "type": "string", + "value": "%s%d%d%s__PENDING__1082417979__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__CC7fYgcqbNa77GbsBbsHY2cExwk9tyJdSpB3Wig1ohYQ", + "type": "string", + "value": "%s%d%d%s__PENDING__2250354116__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__E31rNTSNJ5tRdtZV9DepzDkesqrKVwko3HcWtaDrSyFD", + "type": "string", + "value": "%s%d%d%s__PENDING__800000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMn1g4oEd6q6Fx2zEzs8EBbsRHaCTUSwTd__4sSwNRdn2CX7pmEa4ee6oYY1R7XeUd8qAkMdtwGR5fcG", + "type": "string", + "value": "%s%d%d%s__PENDING__27770337947__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__6f4izjAtjTyz49srEFkDYQKg3VZh85MrGaqD5853uRr9", + "type": "string", + "value": "%s%d%d%s__PENDING__150000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__9xbVkc3grQBeBCrxX1fd3wusWa14cZtDhkFGx5A8Q2qp", + "type": "string", + "value": "%s%d%d%s__PENDING__60120000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__AHQJMxSgrCkevZNWzBCcik2CT971kuRiQGWQfq2Z2Et4", + "type": "string", + "value": "%s%d%d%s__PENDING__102000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__AsmantJEUSf6FcovCUGMeLqY2Tju6Ph5gEfNy91QzWVK", + "type": "string", + "value": "%s%d%d%s__PENDING__23000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__HMxC1o7rAnWDSXqeqWT9GnPWxTbF9GWXRGPRVHi3DgGy", + "type": "string", + "value": "%s%d%d%s__PENDING__112000000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PN2JRxJxjjZo1YJGyQrxdhoEbijc24BMY3__2tJMUah5hfeYuEoRrCFTKz18DSkqoguY3b9LweSfobKW", + "type": "string", + "value": "%s%d%d%s__PENDING__100000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PN2JRxJxjjZo1YJGyQrxdhoEbijc24BMY3__3kc77rtLUoJkaXxczvC2PbLaoNKxY86Q3xWwfGoCH6Uo", + "type": "string", + "value": "%s%d%d%s__PENDING__100000000__1__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PNE4mzP29TyWqFcYwnY81rbH3VwV6yhz3F__4qDYxDrqNVTJZzk3BxbT2uKNv1CsWRzBzTfUTNZyRc8Q", + "type": "string", + "value": "%s%d%d%s__PENDING__7500000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PNE4mzP29TyWqFcYwnY81rbH3VwV6yhz3F__DRHaW2EnaG2prxNZNQwLh98fr435A2JEZch1Z1TuBohu", + "type": "string", + "value": "%s%d%d%s__PENDING__11219572500__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PNMYZEJvMFpsAtuGszT4pmZkGuq6wkm2C3__7r4aeFjEN8xQ9FUTDxWVLGsh6Sjmcodppxu1QQ159nrH", + "type": "string", + "value": "%s%d%d%s__PENDING__2511376__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PNMYZEJvMFpsAtuGszT4pmZkGuq6wkm2C3__9JZcvCkjkjwrrGXfUjdWS8cgVQs9dGnYK3fxtqwuKLao", + "type": "string", + "value": "%s%d%d%s__PENDING__1464210__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__33iZJHJMKsjUk5H8YqhBZxSD2DKRiCmNrqHHe5E4qauN", + "type": "string", + "value": "%s%d%d%s__PENDING__264973207__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__Akfx7XfCpbux94eJ8iK4WS5AxJQTbZU3ksfVWaYmaoWm", + "type": "string", + "value": "%s%d%d%s__PENDING__352096109__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__BtFtoTvrydPWPVNjCfuKSFfLG1qmosoxRX5Po93CUAd7", + "type": "string", + "value": "%s%d%d%s__PENDING__397158954__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__CEiaGJM3QMPCiwst4VodF61F1dx4CuPiJ5LiWuyb96Dn", + "type": "string", + "value": "%s%d%d%s__PENDING__410380041__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__9DBajjZRQJtjxea9JX7dgDqfVoq34Vyaw26oZDimKe9u", + "type": "string", + "value": "%s%d%d%s__PENDING__3553759632__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__Gtx3Vyf9jagWnnpPyRkbSwtGEvcbsU9BqVbMNHcAXr9h", + "type": "string", + "value": "%s%d%d%s__PENDING__23855625373__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__n3PP9EvGbGYrS32aX9oDabRyRKj42KFmP5ufb7Y6ght", + "type": "string", + "value": "%s%d%d%s__PENDING__4467412173__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PNeryRJqvnG1LhGaRQFZpo3FbtRcG1XUAP__A5sdPqmbw1XoeUxmbaWpiArJhFmx95vJTj4uuRg73oE9", + "type": "string", + "value": "%s%d%d%s__PENDING__118226582__1__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__2ebkb2cLaZXmyEisyTnBizosMSdm1hWU1TVePWZCJ5fF", + "type": "string", + "value": "%s%d%d%s__PENDING__4720830954__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__B6xmUHwecRUDQa2NTJDwL4WqmJCGaV5AaaAT3Pgt2RF6", + "type": "string", + "value": "%s%d%d%s__PENDING__3722048229__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__BNUreyUB7YSPWWrMicjGzgt9wxzAkAco2MK7kGQBysYe", + "type": "string", + "value": "%s%d%d%s__PENDING__4949999601__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__H1R65xBvcB1fLwRBvfXYFjpuMGkL35FFicaj1cqvK55g", + "type": "string", + "value": "%s%d%d%s__PENDING__859876593__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPF9dNLQxrg6ARTkNnSuo6rAhuDo68YQ7r__EApLgiPoLyHpBiBqXnyjVi9LpnpTzbLdKBsiZSLMbqjf", + "type": "string", + "value": "%s%d%d%s__PENDING__4705014510__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__9Diy1w6Mj2NHgdMB5PvbESzuki1DN8P86PFv9qeykAP7", + "type": "string", + "value": "%s%d%d%s__PENDING__58973700__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__F5arLeYN68LYMDJz7EXHyouk7WcAtUNtuMZs3ejZm3F4", + "type": "string", + "value": "%s%d%d%s__PENDING__245284462__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__HjHFEAS7pz8J8HLmgBS7rZqzXsu9Yti1JASsSrWRveWr", + "type": "string", + "value": "%s%d%d%s__PENDING__126448836__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPPTqGUYHJUYqKkRCV3kAS44guun9iN7J8__Aquz2sGoefWKdV6ER1xJeepHR8yUvP4V1Fp4ixRzH25G", + "type": "string", + "value": "%s%d%d%s__PENDING__57668312500__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__3vg8kegbVm2ejmrW7xaMUV6KdZ61cWmVs6KE1MRpdna2", + "type": "string", + "value": "%s%d%d%s__PENDING__88986460__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5CFLiisJTWnVMBjc6UYKH9cA37Zg2fvtMDTj98Qo1s8b", + "type": "string", + "value": "%s%d%d%s__PENDING__47556289__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5Jxs9Rb9wVXf7j3ZsZA4Mkumth9Uc7dkuUzvbZFxVRS", + "type": "string", + "value": "%s%d%d%s__PENDING__43706593__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5WRLsrAPUSqE3R62TB3UG3uAnEPJmiFhQK8LZ2qRfhKE", + "type": "string", + "value": "%s%d%d%s__PENDING__12064822__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__6PgMYrWFnB1NyCcNLhYwoqbtwrcphZEDA3LAwyZfgdvo", + "type": "string", + "value": "%s%d%d%s__PENDING__92521109__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__98nS5WboAyAdDDW91Wvjaxtj179FEeaJx1C48DRJTtee", + "type": "string", + "value": "%s%d%d%s__PENDING__49647212__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__9TUKDy1kHtZtevGbwmeUJomF89hg4jv5QuNLqbA3JPu5", + "type": "string", + "value": "%s%d%d%s__PENDING__42112827__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__9oPVAXjVUkuarf4Jy5JyHcsVJBAyVxyjdVMvU6neMx9m", + "type": "string", + "value": "%s%d%d%s__PENDING__272651656__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__CtP9dMwb1rJbPWgVbvNM8qJmh3NX7XhPiAbQFG9A5YW", + "type": "string", + "value": "%s%d%d%s__PENDING__47485678__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__GKvQpH5qyNFDwBjszeopK57za2RKPhtrV2YH6H5MqQDH", + "type": "string", + "value": "%s%d%d%s__PENDING__51021072__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPVhnD2CG64dvGrKcXabDyg9zMyvwXQkA4__8Tfk3vV78xCGEYWwz8aUPsWdym4AgUPjMenKZh93VD8q", + "type": "string", + "value": "%s%d%d%s__PENDING__582547612__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__6j9z4RYqcE5jLq9dNWVnirXXiJ8vdyUv2ReJBDjqD9xX", + "type": "string", + "value": "%s%d%d%s__PENDING__794114838__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__8hddFNEJ3Qt4yHUKexAE7nddnRhT9gD5vRdGVvWcMzux", + "type": "string", + "value": "%s%d%d%s__PENDING__1127422959__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__AQeSJmdEX9BM5R3LACFdiCHY8F7XgdoCspZJbGgtBPXm", + "type": "string", + "value": "%s%d%d%s__PENDING__1112701754__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__C5i6YLpJwctyXrHYQ2wc1t1pv6mSVvJ93DH4yxnD73xQ", + "type": "string", + "value": "%s%d%d%s__PENDING__290121282__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__C6benzi7c8F638LWtTMxz8MbRTv8EC7G7TrzJNAkL7hN", + "type": "string", + "value": "%s%d%d%s__PENDING__3807508493__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__EuaDZJsUjWcMyMUxKLrCAAZEFut7MDAb3hx7MK2WKXoo", + "type": "string", + "value": "%s%d%d%s__PENDING__1388252316__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__FYA2ByvLvACU5WwQvdU7wH1ViJmMGQUxgLF4KhU2Lg9E", + "type": "string", + "value": "%s%d%d%s__PENDING__395958686__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__GetcvZmgP3jvFAwB7CvjBvPxArzxDCcRN14FhZKRh9Gq", + "type": "string", + "value": "%s%d%d%s__PENDING__436554860__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__k7tCtzPDF7cV2ytLXqxgPfysczzJ2T2Moo4ViPKoALj", + "type": "string", + "value": "%s%d%d%s__PENDING__439418250__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPaeRJpqdmWaNii5WvcvwmDteXZ8RkbTqA__2t3E4Y6TmgdCMn7UAjUQ97cGWgTRJdk6wEx3bkBBodJP", + "type": "string", + "value": "%s%d%d%s__PENDING__2852701640__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPoHiMrFPAKBsUKiBajVGzSrUGpz1hdJ7W__BhUKSTTLGA9G7R8PrYrLWtyHCXp5KcayxAJcpMUSGaV2", + "type": "string", + "value": "%s%d%d%s__PENDING__744927014__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPoHiMrFPAKBsUKiBajVGzSrUGpz1hdJ7W__CCEu4evWfwPyqL84DWiUbEGvVMiny2HU6daC99Ypinjt", + "type": "string", + "value": "%s%d%d%s__PENDING__517848375__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__52LeJ3r4JSVCMFRDsfnMvMsJejtYbB1iq3kRfLhyZGuJ", + "type": "string", + "value": "%s%d%d%s__PENDING__50000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__8VcrH4zxgYKX8M9V3DHrDZwrRdeTfKaVE5z4pR2gmUGK", + "type": "string", + "value": "%s%d%d%s__PENDING__300000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__CKXSfCRMUy4ecdSCz7QNAcKUcGGBetKt2vQqDG7H2f8M", + "type": "string", + "value": "%s%d%d%s__PENDING__650000000__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQBxD7LjHw9vag6XohS9QFs9EyFDBUWzA6__6oN7aQFiYSUVzWCjYHWGeVzYfVpCqBwiSqcZc1WNdZND", + "type": "string", + "value": "%s%d%d%s__PENDING__6488412500__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__AJtPpEpBvuDwBKxMDdxLLFxF43Wvso4iLRjDxrevhnF7", + "type": "string", + "value": "%s%d%d%s__PENDING__1990048072__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__ApDtWNtZSFTZAZ5YhW1BWgtBJMaM35vseAZKno1kvqFb", + "type": "string", + "value": "%s%d%d%s__PENDING__224432354__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__BvPELHTyNfM9vFD7LZtNZ8Z5T9sghkRgPk78ciiLYekp", + "type": "string", + "value": "%s%d%d%s__PENDING__1537932461__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__CNdg1ue8v4KRoAotXfrvNMq6WWb4X1kwXPnWZgRAqLE5", + "type": "string", + "value": "%s%d%d%s__PENDING__3828673277__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__QGmkfh3gT7U2oUhyavSGq6x4i3qMz1oJcTnui1Wxodw", + "type": "string", + "value": "%s%d%d%s__PENDING__5284407404__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__bD6dA8xv5Yh4vvY7MVEABy9X2YhKhM6xAZsntiEqj93", + "type": "string", + "value": "%s%d%d%s__PENDING__3554156418__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__8C6PFFdPkyKPhcX6CmmdjdruiRjMfEzsGzFDq6GMLUkn", + "type": "string", + "value": "%s%d%d%s__PENDING__50024613538__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__HZY84W5PdvUumEJwK79FJVvFs8EeZZmRxW2oTRy27xWJ", + "type": "string", + "value": "%s%d%d%s__PENDING__75840474800__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__HjnPhhgA6ZnaAo7CKM7VictjBpaE5LberDY7n9EbYddY", + "type": "string", + "value": "%s%d%d%s__PENDING__50888078135__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__vkx3YymHjBha2FWAKC5PEq8Nq8VcwYyrAfk5khk2dib", + "type": "string", + "value": "%s%d%d%s__PENDING__84664215665__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQhGvLgHdUt4GviS8wX5ZwqAZQPv5mnUoi__HGBV4ro9G3WTUnUynnBWFhrW55NBSU9NgU9ZrHHLLMMX", + "type": "string", + "value": "%s%d%d%s__PENDING__40727194436__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__4Hetgye6J6G2CzJs6QvJyMgrS7LLA8TU6sW1cP36hv6E", + "type": "string", + "value": "%s%d%d%s__PENDING__416625275__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__4vSn8c4FPJRmSoUYxfWugH6AgcGqSTWpu8xhegVfuVEK", + "type": "string", + "value": "%s%d%d%s__PENDING__302486188__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__62Pk9JSsMn7zra3iR9f2927bC9NTqoiQ6aaYu1V7kdBR", + "type": "string", + "value": "%s%d%d%s__PENDING__274219464__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__8Q78hTVQCYi3sS86tPbDLiW2fpVY8BtM6TAcaJkL3ENH", + "type": "string", + "value": "%s%d%d%s__PENDING__200567172__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__9d6f2HV6z9xxm9zY1LBBHALj842T9qcp8m67nVyYrfb5", + "type": "string", + "value": "%s%d%d%s__PENDING__193750156__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__9zf7KkzERyG7wFdRJoNcoFM6AQSgNFdBRVHVJPBLzYH1", + "type": "string", + "value": "%s%d%d%s__PENDING__221712181__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__ADiuX8e2rUukzJ2LJsSyJ8ZXyiqyWHX1A8prHHMJg1Tg", + "type": "string", + "value": "%s%d%d%s__PENDING__225212936__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__AXzYfacF89xP3V1HPJpHtFyWr6NSUSghY5uf4k8i4t2E", + "type": "string", + "value": "%s%d%d%s__PENDING__239849064__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__DAWXUb2yCRC7skYyB27Bfh9Beg2hJKZWfGu6D2QZjRGC", + "type": "string", + "value": "%s%d%d%s__PENDING__234455985__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__DBnGAbNokVUFEB9ZbeSHT64iMDWEQLQZj2fHkj42SPAi", + "type": "string", + "value": "%s%d%d%s__PENDING__243643334__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__ED4xMGmBmtkfrxKubEEmCBDNVDETS3MM7Lg7c16WiZFD", + "type": "string", + "value": "%s%d%d%s__PENDING__236765963__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__Ff5SisM2KUuXKEbD1Cw5gxD3z5SHotfYzCPCjbkvYhbX", + "type": "string", + "value": "%s%d%d%s__PENDING__267838936__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__GCLdGUJH1mBpAUG8ezQnU4NPf6EwMcUPi1XTvEeTHZhR", + "type": "string", + "value": "%s%d%d%s__PENDING__241810714__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__GLKSzAta5nxi3pcQ1znBbDK2ucK4XtdqiFmwnzQ3cmQ", + "type": "string", + "value": "%s%d%d%s__PENDING__232329835__2__SOON" + }, + { + "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__rf3YcR8sYXFLR4xH7KexyyLFrsrUEWGxZamGtWiVJwG", + "type": "string", + "value": "%s%d%d%s__PENDING__233290680__2__SOON" + } +] \ No newline at end of file From 2e7747dc18ee057434b78530acc09ff1216e9c94 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Mon, 11 Dec 2023 09:10:05 +0300 Subject: [PATCH 141/143] Update migration Updated withdraw migration data txs --- migrations/withdrawals/factory_dataTx_0.json | 192 ++++---- migrations/withdrawals/factory_dataTx_1.json | 298 ++++++------ migrations/withdrawals/factory_dataTx_2.json | 300 ++++++------ migrations/withdrawals/factory_dataTx_3.json | 434 +----------------- migrations/withdrawals/factory_dataTx_4.json | 458 ------------------- migrations/withdrawals/factory_dataTx_5.json | 458 ------------------- migrations/withdrawals/factory_dataTx_6.json | 458 ------------------- migrations/withdrawals/factory_dataTx_7.json | 305 ------------ 8 files changed, 414 insertions(+), 2489 deletions(-) delete mode 100644 migrations/withdrawals/factory_dataTx_4.json delete mode 100644 migrations/withdrawals/factory_dataTx_5.json delete mode 100644 migrations/withdrawals/factory_dataTx_6.json delete mode 100644 migrations/withdrawals/factory_dataTx_7.json diff --git a/migrations/withdrawals/factory_dataTx_0.json b/migrations/withdrawals/factory_dataTx_0.json index e2b9523..17ca399 100644 --- a/migrations/withdrawals/factory_dataTx_0.json +++ b/migrations/withdrawals/factory_dataTx_0.json @@ -31,42 +31,6 @@ "type": "integer", "value": 1000000000 }, - { - "key": "%s%s%s__withdrawal__3P28abJrxAfRfvS5bkJrptGB1pKjqQpJBRN__HKcjB27v3sKJBTQ7X34diHbMcB6VaQiLJEMkuAGWJ5YP", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P28abJrxAfRfvS5bkJrptGB1pKjqQpJBRN__HKcjB27v3sKJBTQ7X34diHbMcB6VaQiLJEMkuAGWJ5YP", - "type": "integer", - "value": 1907328148 - }, - { - "key": "%s%s%s__withdrawal__3P28givMmcWHShNnediwXnduqRuvURXCNJa__9AkcBpoiE6JWS6kvtN4PggQ2gGrvEFFxyW3hjd5HcA9X", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P28givMmcWHShNnediwXnduqRuvURXCNJa__9AkcBpoiE6JWS6kvtN4PggQ2gGrvEFFxyW3hjd5HcA9X", - "type": "integer", - "value": 5000000000 - }, - { - "key": "%s%s%s__withdrawal__3P28givMmcWHShNnediwXnduqRuvURXCNJa__EUUHnusTxjxeV9pREp2ZL2pGrd759aXngSChXMeBwPF4", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P28givMmcWHShNnediwXnduqRuvURXCNJa__EUUHnusTxjxeV9pREp2ZL2pGrd759aXngSChXMeBwPF4", - "type": "integer", - "value": 1487910528 - }, - { - "key": "%s%s%s__withdrawal__3P28givMmcWHShNnediwXnduqRuvURXCNJa__FTknmrqxkzLttQMzQgsx4K9B84swKCyrjJnaJnqHgYkz", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P28givMmcWHShNnediwXnduqRuvURXCNJa__FTknmrqxkzLttQMzQgsx4K9B84swKCyrjJnaJnqHgYkz", - "type": "integer", - "value": 100077726 - }, { "key": "%s%s%s__withdrawal__3P2CehRGv7JNCpS91ksqLwVdtyFz3LZ5y2L__A3TDK7zXCdvQkTPpMFhPVaSENynHfGRJpUsAYkGrMfvE", "value": null @@ -76,15 +40,6 @@ "type": "integer", "value": 100000000 }, - { - "key": "%s%s%s__withdrawal__3P2FMHavshKyciyu8cHvkVjkwppqXmz7nWm__5hdHLv4mvdkacS2APJpJmDxfx89cbis9ttKMjiV7F1s", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P2FMHavshKyciyu8cHvkVjkwppqXmz7nWm__5hdHLv4mvdkacS2APJpJmDxfx89cbis9ttKMjiV7F1s", - "type": "integer", - "value": 971000000 - }, { "key": "%s%s%s__withdrawal__3P2FMHavshKyciyu8cHvkVjkwppqXmz7nWm__BFLgdNULfw4r33pMuJfDG2GhvLwH8BUdssL5rPsZqDpp", "value": null @@ -94,15 +49,6 @@ "type": "integer", "value": 28481081050 }, - { - "key": "%s%s%s__withdrawal__3P2FMHavshKyciyu8cHvkVjkwppqXmz7nWm__Fj76Cw6M3kt8kqQbKLAQMMbZ3W368ZAFTHN2MoHG4VA6", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P2FMHavshKyciyu8cHvkVjkwppqXmz7nWm__Fj76Cw6M3kt8kqQbKLAQMMbZ3W368ZAFTHN2MoHG4VA6", - "type": "integer", - "value": 1040512831 - }, { "key": "%s%s%s__withdrawal__3P2NgWPbG6QhHX1dTUmdNyEW894Sq5AjTNr__CbPQQX5tL5kUkHDA6uHmdXYkyHL1xsZCj9Vd3WUEUwi5", "value": null @@ -184,15 +130,6 @@ "type": "integer", "value": 1899500000 }, - { - "key": "%s%s%s__withdrawal__3P33dk2pYeVQiVuA9BCE4mTe1nnamrzeb2A__2w7DogsSbAiuzJMigbbt6CzR6T582w1xR6hXwck5TH9g", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P33dk2pYeVQiVuA9BCE4mTe1nnamrzeb2A__2w7DogsSbAiuzJMigbbt6CzR6T582w1xR6hXwck5TH9g", - "type": "integer", - "value": 100000000 - }, { "key": "%s%s%s__withdrawal__3P3CQeeTztHw3YMdneUZgLoHQ6zvRp1eWpF__3ccw6uEPjMskBSABt4L8k74ytrMzq8o8g4Cs53wpwsYo", "value": null @@ -256,15 +193,6 @@ "type": "integer", "value": 88511237500 }, - { - "key": "%s%s%s__withdrawal__3P3qMfjsxSZzED5uCNNCM9bCtc1UqNDLUSM__EsgxeU5D8CJxvmCeuiGaT4HSNb4o6uSd8XKxmMf8H6HY", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P3qMfjsxSZzED5uCNNCM9bCtc1UqNDLUSM__EsgxeU5D8CJxvmCeuiGaT4HSNb4o6uSd8XKxmMf8H6HY", - "type": "integer", - "value": 58276590561 - }, { "key": "%s%s%s__withdrawal__3P4HvMuStrxyJ2eBzUdFTKvju4mCbELNK7K__9DWHGjocwesKcgvRpU6NaoyiLHEr9e39WQ4GxncTqaoU", "value": null @@ -383,76 +311,148 @@ "value": 6224395586 }, { - "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__21zW2eB5Cchr9Jcvy1AkewDg3iNgecsB9MjzxjHQEdoQ", + "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__8L3Er4amvWdoou2UJhz87sz6FGD7nwCC5vphJhQPChe2", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__21zW2eB5Cchr9Jcvy1AkewDg3iNgecsB9MjzxjHQEdoQ", + "key": "%s%s%s__withdrawalHistory__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__8L3Er4amvWdoou2UJhz87sz6FGD7nwCC5vphJhQPChe2", "type": "integer", - "value": 3992989593 + "value": 2944225000 }, { - "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__2SuXH9wxe8WqkMiLDPoqVcNRYwXHuGCLqbYVAwkn5HPT", + "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__ESGj3Bu6yqyx4HeZhz5RM3WCtGyoueY2hbzKZVqZR6dU", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__2SuXH9wxe8WqkMiLDPoqVcNRYwXHuGCLqbYVAwkn5HPT", + "key": "%s%s%s__withdrawalHistory__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__ESGj3Bu6yqyx4HeZhz5RM3WCtGyoueY2hbzKZVqZR6dU", "type": "integer", - "value": 1316690440 + "value": 13581425029 }, { - "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__6LyQj6ieZTYgMiYxWwcpyr3S515S1ZRZ8KzRbWG7ppfA", + "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__Ehb9mKwL8Vu3cVDTEcU8QjNqjjQKDs8PbJds1fmjRKB9", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__6LyQj6ieZTYgMiYxWwcpyr3S515S1ZRZ8KzRbWG7ppfA", + "key": "%s%s%s__withdrawalHistory__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__Ehb9mKwL8Vu3cVDTEcU8QjNqjjQKDs8PbJds1fmjRKB9", "type": "integer", - "value": 199166799 + "value": 9782425053 }, { - "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__9pZ6UX2s9qBtgHHQyageBWNUxwb8jwJ2yX9Fp33docNU", + "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__FBUTJbrTXpTpvJb27iDypdVB4rN9SpQQr9UutnVCfjMv", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__9pZ6UX2s9qBtgHHQyageBWNUxwb8jwJ2yX9Fp33docNU", + "key": "%s%s%s__withdrawalHistory__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__FBUTJbrTXpTpvJb27iDypdVB4rN9SpQQr9UutnVCfjMv", "type": "integer", - "value": 389344231 + "value": 9877400001 }, { - "key": "%s%s%s__withdrawal__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__EHm5bR2DgGeT9DNwPNw94iAjtmVVR44ryudxmwwvxebc", + "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__2MEvJ686WYX7qYWyzrZda2VGj9EbaTMggophFm4Y3WgS", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P4tceRgjPZivEHRbjg2qbnyLaHL7RcRLga__EHm5bR2DgGeT9DNwPNw94iAjtmVVR44ryudxmwwvxebc", + "key": "%s%s%s__withdrawalHistory__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__2MEvJ686WYX7qYWyzrZda2VGj9EbaTMggophFm4Y3WgS", "type": "integer", - "value": 502543115 + "value": 2500000000 }, { - "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__8L3Er4amvWdoou2UJhz87sz6FGD7nwCC5vphJhQPChe2", + "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__5U2kshgnejYtJNWfY434YA2fZ4E2dtszkxKuxuemztHF", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__8L3Er4amvWdoou2UJhz87sz6FGD7nwCC5vphJhQPChe2", + "key": "%s%s%s__withdrawalHistory__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__5U2kshgnejYtJNWfY434YA2fZ4E2dtszkxKuxuemztHF", "type": "integer", - "value": 2944225000 + "value": 2500000000 }, { - "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__ESGj3Bu6yqyx4HeZhz5RM3WCtGyoueY2hbzKZVqZR6dU", + "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__5mMbqoSYxF9V2UDx5MJtm6hqsvjkmARY82RyVLFtykVE", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__ESGj3Bu6yqyx4HeZhz5RM3WCtGyoueY2hbzKZVqZR6dU", + "key": "%s%s%s__withdrawalHistory__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__5mMbqoSYxF9V2UDx5MJtm6hqsvjkmARY82RyVLFtykVE", "type": "integer", - "value": 13581425029 + "value": 5000000000 }, { - "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__Ehb9mKwL8Vu3cVDTEcU8QjNqjjQKDs8PbJds1fmjRKB9", + "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__CSNkxEjsufhfFbCoBRkikAKjoFUtET2vgxagM13HzPmd", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__Ehb9mKwL8Vu3cVDTEcU8QjNqjjQKDs8PbJds1fmjRKB9", + "key": "%s%s%s__withdrawalHistory__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__CSNkxEjsufhfFbCoBRkikAKjoFUtET2vgxagM13HzPmd", "type": "integer", - "value": 9782425053 + "value": 10000000000 + }, + { + "key": "%s%s%s__withdrawal__3P5DW9p3EvAeRksHUAaGy9XSnByWA4Rmtac__EjpHmbEH5sSzPpThRNB5NjgLs5XgY76i3B6cZEHqr9FZ", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5DW9p3EvAeRksHUAaGy9XSnByWA4Rmtac__EjpHmbEH5sSzPpThRNB5NjgLs5XgY76i3B6cZEHqr9FZ", + "type": "integer", + "value": 386691907 + }, + { + "key": "%s%s%s__withdrawal__3P5ExkWasVq9LuvhHnH4mihV1VQPtNWu21N__6fNuurew7EWHYRjCjQX333FqCKdYub7r5TBxbTPTDHtK", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5ExkWasVq9LuvhHnH4mihV1VQPtNWu21N__6fNuurew7EWHYRjCjQX333FqCKdYub7r5TBxbTPTDHtK", + "type": "integer", + "value": 1414477997 + }, + { + "key": "%s%s%s__withdrawal__3P5ExkWasVq9LuvhHnH4mihV1VQPtNWu21N__7SCTkCD42Tqnb6ukhwoUQecCZtGzGWeaSVYzYCeYgRgB", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5ExkWasVq9LuvhHnH4mihV1VQPtNWu21N__7SCTkCD42Tqnb6ukhwoUQecCZtGzGWeaSVYzYCeYgRgB", + "type": "integer", + "value": 79009686430 + }, + { + "key": "%s%s%s__withdrawal__3P5SLaCL3iF2FzrViwtPyuu2ZeoXTnZVExD__HHmLWxxGCDUvtTQzsF1Ndr5M7PSyHxdFmuToB8itdg7R", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P5SLaCL3iF2FzrViwtPyuu2ZeoXTnZVExD__HHmLWxxGCDUvtTQzsF1Ndr5M7PSyHxdFmuToB8itdg7R", + "type": "integer", + "value": 10478125000 + }, + { + "key": "%s%s%s__withdrawal__3P64FgRJU1EPEDMdTeSDyWMjDpGiRkBCLcH__9ZRPuw7fGq1tbdT1BrEMsE43Bhas5ffxxe1A4wcJYFi8", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P64FgRJU1EPEDMdTeSDyWMjDpGiRkBCLcH__9ZRPuw7fGq1tbdT1BrEMsE43Bhas5ffxxe1A4wcJYFi8", + "type": "integer", + "value": 77729698612 + }, + { + "key": "%s%s%s__withdrawal__3P6FjQcHZNggULXG8twvbjpsT1sBU8Sh2yv__HnPo6axXmi3eMDRBiq6bdkTXVxymMUW2dWPKHAHdMLom", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6FjQcHZNggULXG8twvbjpsT1sBU8Sh2yv__HnPo6axXmi3eMDRBiq6bdkTXVxymMUW2dWPKHAHdMLom", + "type": "integer", + "value": 505676149 + }, + { + "key": "%s%s%s__withdrawal__3P6Qdw4cuT9dvTHaHLRJ2iordKyMKJZqUg9__6kPAxnaGt3Gocd66E5bQXtrJdtXC4ohfC4azv2xwBaQR", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P6Qdw4cuT9dvTHaHLRJ2iordKyMKJZqUg9__6kPAxnaGt3Gocd66E5bQXtrJdtXC4ohfC4azv2xwBaQR", + "type": "integer", + "value": 117647058 + }, + { + "key": "%s%s%s__withdrawal__3P7LBLiPjMKP1jeRXnp1LvW5dwMTU3AtyBF__BtGFmASgvxCqKRZoA9eHCkxNJu6vjPRAJHbyH8dWcP4b", + "value": null + }, + { + "key": "%s%s%s__withdrawalHistory__3P7LBLiPjMKP1jeRXnp1LvW5dwMTU3AtyBF__BtGFmASgvxCqKRZoA9eHCkxNJu6vjPRAJHbyH8dWcP4b", + "type": "integer", + "value": 13066160366 } ] } \ No newline at end of file diff --git a/migrations/withdrawals/factory_dataTx_1.json b/migrations/withdrawals/factory_dataTx_1.json index 41bd814..b0d8b97 100644 --- a/migrations/withdrawals/factory_dataTx_1.json +++ b/migrations/withdrawals/factory_dataTx_1.json @@ -5,454 +5,454 @@ "fee": 1500000, "data": [ { - "key": "%s%s%s__withdrawal__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__FBUTJbrTXpTpvJb27iDypdVB4rN9SpQQr9UutnVCfjMv", + "key": "%s%s%s__withdrawal__3P7X9caDLcngjaAqCjwQjzkgMuVoTKNav72__AKuQopJtmx7etmQTv1a8SCnb6PbXNysHGCpWbWGYoq36", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P4yrMZqNqfKiD42fLhdYkFdFvrroYiktFg__FBUTJbrTXpTpvJb27iDypdVB4rN9SpQQr9UutnVCfjMv", + "key": "%s%s%s__withdrawalHistory__3P7X9caDLcngjaAqCjwQjzkgMuVoTKNav72__AKuQopJtmx7etmQTv1a8SCnb6PbXNysHGCpWbWGYoq36", "type": "integer", - "value": 9877400001 + "value": 94984 }, { - "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__2MEvJ686WYX7qYWyzrZda2VGj9EbaTMggophFm4Y3WgS", + "key": "%s%s%s__withdrawal__3P7mqPfcMt4GeBE1U8gF9jgpCT9T85fSK4f__7pyUvTQWYjxQVJDMeVThCeouMHTTKhq4bBZU5RRJR7bL", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__2MEvJ686WYX7qYWyzrZda2VGj9EbaTMggophFm4Y3WgS", + "key": "%s%s%s__withdrawalHistory__3P7mqPfcMt4GeBE1U8gF9jgpCT9T85fSK4f__7pyUvTQWYjxQVJDMeVThCeouMHTTKhq4bBZU5RRJR7bL", "type": "integer", - "value": 2500000000 + "value": 100000000 }, { - "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__5U2kshgnejYtJNWfY434YA2fZ4E2dtszkxKuxuemztHF", + "key": "%s%s%s__withdrawal__3P8bxPavni6rQjNXWFnP6Xw68Bb8gyAB3pb__AbhrfsEnNPKNNfd4UK7Vapi5Hu87HiJmuHYnSHcQZa1E", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__5U2kshgnejYtJNWfY434YA2fZ4E2dtszkxKuxuemztHF", + "key": "%s%s%s__withdrawalHistory__3P8bxPavni6rQjNXWFnP6Xw68Bb8gyAB3pb__AbhrfsEnNPKNNfd4UK7Vapi5Hu87HiJmuHYnSHcQZa1E", "type": "integer", - "value": 2500000000 + "value": 200576587496 }, { - "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__5mMbqoSYxF9V2UDx5MJtm6hqsvjkmARY82RyVLFtykVE", + "key": "%s%s%s__withdrawal__3PAeLTZwJtvRWweZM4M9Jt2V4dVtTpXBCEK__8mjBv5gMedtUSCFnGVecBksdTkPckoDghHAeLsDC9SvF", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__5mMbqoSYxF9V2UDx5MJtm6hqsvjkmARY82RyVLFtykVE", + "key": "%s%s%s__withdrawalHistory__3PAeLTZwJtvRWweZM4M9Jt2V4dVtTpXBCEK__8mjBv5gMedtUSCFnGVecBksdTkPckoDghHAeLsDC9SvF", "type": "integer", - "value": 5000000000 + "value": 4514259699 }, { - "key": "%s%s%s__withdrawal__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__CSNkxEjsufhfFbCoBRkikAKjoFUtET2vgxagM13HzPmd", + "key": "%s%s%s__withdrawal__3PAuU9oc5YmkoHnb4KQMCkxn9ebsykynBCH__3y7ki2i4hvmw675QPH7pG5m5dWoZUcDGvoaRizX67PRH", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P51aktbf6dL6JTAazZcPWeznMRjP7WkCS4__CSNkxEjsufhfFbCoBRkikAKjoFUtET2vgxagM13HzPmd", + "key": "%s%s%s__withdrawalHistory__3PAuU9oc5YmkoHnb4KQMCkxn9ebsykynBCH__3y7ki2i4hvmw675QPH7pG5m5dWoZUcDGvoaRizX67PRH", "type": "integer", "value": 10000000000 }, { - "key": "%s%s%s__withdrawal__3P5DW9p3EvAeRksHUAaGy9XSnByWA4Rmtac__EjpHmbEH5sSzPpThRNB5NjgLs5XgY76i3B6cZEHqr9FZ", + "key": "%s%s%s__withdrawal__3PBVqECkRHz87gJRZpn7oyhFWjZF9vcDcsR__FNAp4dQfrcdRq4fCeQTwgRJbo8xrLarva9HPZttwmTVB", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P5DW9p3EvAeRksHUAaGy9XSnByWA4Rmtac__EjpHmbEH5sSzPpThRNB5NjgLs5XgY76i3B6cZEHqr9FZ", + "key": "%s%s%s__withdrawalHistory__3PBVqECkRHz87gJRZpn7oyhFWjZF9vcDcsR__FNAp4dQfrcdRq4fCeQTwgRJbo8xrLarva9HPZttwmTVB", "type": "integer", - "value": 386691907 + "value": 90000000 }, { - "key": "%s%s%s__withdrawal__3P5ExkWasVq9LuvhHnH4mihV1VQPtNWu21N__6fNuurew7EWHYRjCjQX333FqCKdYub7r5TBxbTPTDHtK", + "key": "%s%s%s__withdrawal__3PBbYtxa4fW8GM5xpqqCP4jyZmCwsNFoe5P__GZMEGN138VLKKzbijnx9HjpVvXCuj28xqVa6JFvpHqms", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P5ExkWasVq9LuvhHnH4mihV1VQPtNWu21N__6fNuurew7EWHYRjCjQX333FqCKdYub7r5TBxbTPTDHtK", + "key": "%s%s%s__withdrawalHistory__3PBbYtxa4fW8GM5xpqqCP4jyZmCwsNFoe5P__GZMEGN138VLKKzbijnx9HjpVvXCuj28xqVa6JFvpHqms", "type": "integer", - "value": 1414477997 + "value": 6215937909 }, { - "key": "%s%s%s__withdrawal__3P5ExkWasVq9LuvhHnH4mihV1VQPtNWu21N__7SCTkCD42Tqnb6ukhwoUQecCZtGzGWeaSVYzYCeYgRgB", + "key": "%s%s%s__withdrawal__3PBitcoinAVGJvpSe6jevepPbT3M8SoMZjb__D4sr8JiTHeMZ1dgvc4ubG8U26Vf7sQ3d6x7LuVEawDFY", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P5ExkWasVq9LuvhHnH4mihV1VQPtNWu21N__7SCTkCD42Tqnb6ukhwoUQecCZtGzGWeaSVYzYCeYgRgB", + "key": "%s%s%s__withdrawalHistory__3PBitcoinAVGJvpSe6jevepPbT3M8SoMZjb__D4sr8JiTHeMZ1dgvc4ubG8U26Vf7sQ3d6x7LuVEawDFY", "type": "integer", - "value": 79009686430 + "value": 4159587500 }, { - "key": "%s%s%s__withdrawal__3P5SLaCL3iF2FzrViwtPyuu2ZeoXTnZVExD__HHmLWxxGCDUvtTQzsF1Ndr5M7PSyHxdFmuToB8itdg7R", + "key": "%s%s%s__withdrawal__3PCLkgzwEY71DDLtkPYAs1gsbbJoqmiqn62__2waf3wGnXM8h7fEJ9iWS5mcczeLj6e6gDWRA8ZALN7mC", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P5SLaCL3iF2FzrViwtPyuu2ZeoXTnZVExD__HHmLWxxGCDUvtTQzsF1Ndr5M7PSyHxdFmuToB8itdg7R", + "key": "%s%s%s__withdrawalHistory__3PCLkgzwEY71DDLtkPYAs1gsbbJoqmiqn62__2waf3wGnXM8h7fEJ9iWS5mcczeLj6e6gDWRA8ZALN7mC", "type": "integer", - "value": 10478125000 + "value": 11621912872 }, { - "key": "%s%s%s__withdrawal__3P5fDzDn5QnFFYJqwzkijVv2naN3PL9uHGv__2KLy91J2Rem5JyotF78NuwP7LB66WNibE7nHHYUqvrr1", + "key": "%s%s%s__withdrawal__3PCLkgzwEY71DDLtkPYAs1gsbbJoqmiqn62__4BMq52B44fjuFLR2GXrmmY8F7FnqXE3HCaF2Vx8EUrMh", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P5fDzDn5QnFFYJqwzkijVv2naN3PL9uHGv__2KLy91J2Rem5JyotF78NuwP7LB66WNibE7nHHYUqvrr1", + "key": "%s%s%s__withdrawalHistory__3PCLkgzwEY71DDLtkPYAs1gsbbJoqmiqn62__4BMq52B44fjuFLR2GXrmmY8F7FnqXE3HCaF2Vx8EUrMh", "type": "integer", - "value": 84681407662 + "value": 2817361866 }, { - "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__2XxkkiecnXKuz3HAhpFF1ubwPZEhGo2d4HWDSss9zQpG", + "key": "%s%s%s__withdrawal__3PCRRYmirzTXmLZ9R2peoxYD4AugayNAizG__3KHFpr16VcnwNvs1E5ygi1pgEmdqQw17bwkeCDosQow4", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__2XxkkiecnXKuz3HAhpFF1ubwPZEhGo2d4HWDSss9zQpG", + "key": "%s%s%s__withdrawalHistory__3PCRRYmirzTXmLZ9R2peoxYD4AugayNAizG__3KHFpr16VcnwNvs1E5ygi1pgEmdqQw17bwkeCDosQow4", "type": "integer", - "value": 399237098 + "value": 683944419 }, { - "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__4CgWn3kPZEuFHgDeQPdX7Kc9vuSMzhwpWDC7U9tyMcgj", + "key": "%s%s%s__withdrawal__3PCRRYmirzTXmLZ9R2peoxYD4AugayNAizG__D9JX8EZ6gJiEei1FD5BvKihbfctDEWDvmvZ4KqAsR39A", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__4CgWn3kPZEuFHgDeQPdX7Kc9vuSMzhwpWDC7U9tyMcgj", + "key": "%s%s%s__withdrawalHistory__3PCRRYmirzTXmLZ9R2peoxYD4AugayNAizG__D9JX8EZ6gJiEei1FD5BvKihbfctDEWDvmvZ4KqAsR39A", "type": "integer", - "value": 405708067 + "value": 616679837 }, { - "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__5fnBRLgNwXMQwtUMQm2T5DfUp5UgqFu5MRVpzzdn59Q5", + "key": "%s%s%s__withdrawal__3PCoDJZ4R95qFdiAwdhjf9y2jtTiskJ9STo__9BfbSk8Eo9tA5rdgyJ6RYKDhyrGqZktvX5ngfbSF7oqs", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__5fnBRLgNwXMQwtUMQm2T5DfUp5UgqFu5MRVpzzdn59Q5", + "key": "%s%s%s__withdrawalHistory__3PCoDJZ4R95qFdiAwdhjf9y2jtTiskJ9STo__9BfbSk8Eo9tA5rdgyJ6RYKDhyrGqZktvX5ngfbSF7oqs", "type": "integer", - "value": 452133934 + "value": 100000000 }, { - "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__5ptTeZ4udFP6CzTpQU55cVWWHc2bD3ZeMHDReSeKnoxy", + "key": "%s%s%s__withdrawal__3PCwtPsA4s2fyZrYs8A9QS2SgUr1Xe9qriV__AVeQzWSiEN7kGx23ycUg6rX4LdMZGDuLkY4rMrEsgHUr", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__5ptTeZ4udFP6CzTpQU55cVWWHc2bD3ZeMHDReSeKnoxy", + "key": "%s%s%s__withdrawalHistory__3PCwtPsA4s2fyZrYs8A9QS2SgUr1Xe9qriV__AVeQzWSiEN7kGx23ycUg6rX4LdMZGDuLkY4rMrEsgHUr", "type": "integer", - "value": 386438843 + "value": 86870275 }, { - "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__8NHAnPJwrLEuhVkHwJgFJ4xVfvNwjubXAskAGNmA7Lf3", + "key": "%s%s%s__withdrawal__3PDMAiABRewTdMeNnGuVC3mWG7tQVuBWzYn__3cczdjKSoAY545hpRCJMZE6cBE9ZXgnMR7v6328rk7Fe", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__8NHAnPJwrLEuhVkHwJgFJ4xVfvNwjubXAskAGNmA7Lf3", + "key": "%s%s%s__withdrawalHistory__3PDMAiABRewTdMeNnGuVC3mWG7tQVuBWzYn__3cczdjKSoAY545hpRCJMZE6cBE9ZXgnMR7v6328rk7Fe", "type": "integer", - "value": 289800788 + "value": 4125527466 }, { - "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__BtmM6Czj887fLmaLkN3bzJvNwNxqVh9SdFVB8SEDNJQP", + "key": "%s%s%s__withdrawal__3PDRLD37a7qwABsxiKgfpJeqUt5CuSjetLL__HPMkfvfLYwy95G2uSyc1AQSdq6eC1bxBbbgzC3JDevSv", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__BtmM6Czj887fLmaLkN3bzJvNwNxqVh9SdFVB8SEDNJQP", + "key": "%s%s%s__withdrawalHistory__3PDRLD37a7qwABsxiKgfpJeqUt5CuSjetLL__HPMkfvfLYwy95G2uSyc1AQSdq6eC1bxBbbgzC3JDevSv", "type": "integer", - "value": 2044967239 + "value": 8668503954 }, { - "key": "%s%s%s__withdrawal__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__DoW38nhyb9QDPSqiojxAX1YfDG9Pew7VVBW5Ebgkg5im", + "key": "%s%s%s__withdrawal__3PDyGuhrKsitcBJHJg1fviJQ4NoFFm3AR3j__13zpZkbR9BphAjNYLBrFhS8JjpFLcNcZq7jnDrDQeSSc", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P5w5Fzn2tqoLTVH7zP1TnEQpRYYnGox7JL__DoW38nhyb9QDPSqiojxAX1YfDG9Pew7VVBW5Ebgkg5im", + "key": "%s%s%s__withdrawalHistory__3PDyGuhrKsitcBJHJg1fviJQ4NoFFm3AR3j__13zpZkbR9BphAjNYLBrFhS8JjpFLcNcZq7jnDrDQeSSc", "type": "integer", - "value": 799767551 + "value": 5498421 }, { - "key": "%s%s%s__withdrawal__3P64FgRJU1EPEDMdTeSDyWMjDpGiRkBCLcH__9ZRPuw7fGq1tbdT1BrEMsE43Bhas5ffxxe1A4wcJYFi8", + "key": "%s%s%s__withdrawal__3PE6zfGg6yYimCXnNZzNZcCvuzRM719PGwm__4EkYEvEcN9VcNMybZyBvguS6VvezrFCCkWPFswEjMTyR", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64FgRJU1EPEDMdTeSDyWMjDpGiRkBCLcH__9ZRPuw7fGq1tbdT1BrEMsE43Bhas5ffxxe1A4wcJYFi8", + "key": "%s%s%s__withdrawalHistory__3PE6zfGg6yYimCXnNZzNZcCvuzRM719PGwm__4EkYEvEcN9VcNMybZyBvguS6VvezrFCCkWPFswEjMTyR", "type": "integer", - "value": 77729698612 + "value": 134808490 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__27ufGrqNb3MJhQigzNBaF55kJS79L2e5KGNGmXrJRmra", + "key": "%s%s%s__withdrawal__3PEM8TcwGMAmpSLA4tUkNRD1bsP7a62aAMS__2zMfat2vvXzUmirwoWhrLc1fCyh5irNtu98HbZsUzX3Q", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__27ufGrqNb3MJhQigzNBaF55kJS79L2e5KGNGmXrJRmra", + "key": "%s%s%s__withdrawalHistory__3PEM8TcwGMAmpSLA4tUkNRD1bsP7a62aAMS__2zMfat2vvXzUmirwoWhrLc1fCyh5irNtu98HbZsUzX3Q", "type": "integer", - "value": 812529046 + "value": 3600000000 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__56fbD8GAoHQLJdcmb3NW1bhnqBUZBCoe9ckdRtqsAQmx", + "key": "%s%s%s__withdrawal__3PEbmcoRgzuf6W67XFqn6rm9PKU744H8PGG__AWZjFnDT9hJDPUwsvf3azouBZ1ipJymNMfTNJRtwGjpB", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__56fbD8GAoHQLJdcmb3NW1bhnqBUZBCoe9ckdRtqsAQmx", + "key": "%s%s%s__withdrawalHistory__3PEbmcoRgzuf6W67XFqn6rm9PKU744H8PGG__AWZjFnDT9hJDPUwsvf3azouBZ1ipJymNMfTNJRtwGjpB", "type": "integer", - "value": 887530143 + "value": 58558547 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__5yVJByChonNrAGiqcjSogz3mLfWkKZ9sdsqba5PKTVbE", + "key": "%s%s%s__withdrawal__3PEbpUKHrLw4y5uLie6QEtsAS74TC5CRMLb__E5LBHGLTGgVc5hj8TviwwebHjjE9LCv6unw7QXkRJwao", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__5yVJByChonNrAGiqcjSogz3mLfWkKZ9sdsqba5PKTVbE", + "key": "%s%s%s__withdrawalHistory__3PEbpUKHrLw4y5uLie6QEtsAS74TC5CRMLb__E5LBHGLTGgVc5hj8TviwwebHjjE9LCv6unw7QXkRJwao", "type": "integer", - "value": 1625239283 + "value": 2528864617 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__7PP4v8Cga13AgTddSJSRPdTj5DrKcfx6YyigMRjkRedZ", + "key": "%s%s%s__withdrawal__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__CXhPZTuuWrv4SYAXnUSDGXgQd4Rjt28e32GVgn9SUg1n", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__7PP4v8Cga13AgTddSJSRPdTj5DrKcfx6YyigMRjkRedZ", + "key": "%s%s%s__withdrawalHistory__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__CXhPZTuuWrv4SYAXnUSDGXgQd4Rjt28e32GVgn9SUg1n", "type": "integer", - "value": 891089016 + "value": 3743476274 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__7muns56cCpjbahT2xqL29MtLFSL8aWAgij7VnEQ4nXFo", + "key": "%s%s%s__withdrawal__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__DkceM4tfugUJ9HVVYwtt9VyvKhTAm1YVYSivMZTViKAE", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__7muns56cCpjbahT2xqL29MtLFSL8aWAgij7VnEQ4nXFo", + "key": "%s%s%s__withdrawalHistory__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__DkceM4tfugUJ9HVVYwtt9VyvKhTAm1YVYSivMZTViKAE", "type": "integer", - "value": 888735168 + "value": 41878551773 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__8DQtD3ah2f8R6ziTN77KcgKBrj5WHD7GCoyFXeTazPGj", + "key": "%s%s%s__withdrawal__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__GzDQVuTc8sG2g6CRGCzTNus9kWujuGf3kYViYG9z98k", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__8DQtD3ah2f8R6ziTN77KcgKBrj5WHD7GCoyFXeTazPGj", + "key": "%s%s%s__withdrawalHistory__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__GzDQVuTc8sG2g6CRGCzTNus9kWujuGf3kYViYG9z98k", "type": "integer", - "value": 835592997 + "value": 9366361994 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__AYvhQXdKs2wYp4SFR8jK5r29eHUUN6AAGzvg2yjnKH7f", + "key": "%s%s%s__withdrawal__3PF2RKwvJ4Cq45mEtSbG7trbU3yJ2ynZfVu__AejckCY2gxT1o7TnuQ7cFW2mqKQgqzFmKXgpzMG7GKc", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__AYvhQXdKs2wYp4SFR8jK5r29eHUUN6AAGzvg2yjnKH7f", + "key": "%s%s%s__withdrawalHistory__3PF2RKwvJ4Cq45mEtSbG7trbU3yJ2ynZfVu__AejckCY2gxT1o7TnuQ7cFW2mqKQgqzFmKXgpzMG7GKc", "type": "integer", - "value": 232087433 + "value": 983457060 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__B9Tb8meLakqFy1e3a6UKp7nruLu8cHjuUVKVQGCNtKG8", + "key": "%s%s%s__withdrawal__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__2pyjMwQx7T1LiWdrw4huDdYbGga3rcaK1n9MDba5yEnW", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__B9Tb8meLakqFy1e3a6UKp7nruLu8cHjuUVKVQGCNtKG8", + "key": "%s%s%s__withdrawalHistory__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__2pyjMwQx7T1LiWdrw4huDdYbGga3rcaK1n9MDba5yEnW", "type": "integer", - "value": 870150724 + "value": 37716698183 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__BEJLjTHAuai8622RSkDMyk1eK58JxYiMUSd5FPHrwba6", + "key": "%s%s%s__withdrawal__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__EiGNbkvVnEHPUHmiZS3tk4VbupTZnLt6Cfot6i7zoToF", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__BEJLjTHAuai8622RSkDMyk1eK58JxYiMUSd5FPHrwba6", + "key": "%s%s%s__withdrawalHistory__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__EiGNbkvVnEHPUHmiZS3tk4VbupTZnLt6Cfot6i7zoToF", "type": "integer", - "value": 975432937 + "value": 27500000000 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__Big7gJnGgpgH6zcENjMsxMb5pNLKcyawjk9BtrdqQMjY", + "key": "%s%s%s__withdrawal__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__GJ6evDKg13d84WYbLiFHHpxnjdK17U3zVZmFjiEXWu7d", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__Big7gJnGgpgH6zcENjMsxMb5pNLKcyawjk9BtrdqQMjY", + "key": "%s%s%s__withdrawalHistory__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__GJ6evDKg13d84WYbLiFHHpxnjdK17U3zVZmFjiEXWu7d", "type": "integer", - "value": 949167159 + "value": 19425217483 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__BprQYizZ5uvVobULnVCpkfkLFXzrjwsEzsQLyRE8SHbg", + "key": "%s%s%s__withdrawal__3PFDVSLtgPpPxiFHsUxxkv7NvyCuRSDHBc3__5znpEMbF6XVjjBoaFe7N59evehdu596qTpiDapCj8u8", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__BprQYizZ5uvVobULnVCpkfkLFXzrjwsEzsQLyRE8SHbg", + "key": "%s%s%s__withdrawalHistory__3PFDVSLtgPpPxiFHsUxxkv7NvyCuRSDHBc3__5znpEMbF6XVjjBoaFe7N59evehdu596qTpiDapCj8u8", "type": "integer", - "value": 916865073 + "value": 1329650000 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__FbNRVDQN6ZPuvMoFQyv5DRE8hRPz9Vub4cRUeuuZcExB", + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__21pzAUwcSzei1tNRnDgbCK3DVF5SGycbgkhrCFrLN2rC", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__FbNRVDQN6ZPuvMoFQyv5DRE8hRPz9Vub4cRUeuuZcExB", + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__21pzAUwcSzei1tNRnDgbCK3DVF5SGycbgkhrCFrLN2rC", "type": "integer", - "value": 904074418 + "value": 853395178 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__GESy939vvVaiE8opgpbpkUofpw4VDnJUvzFnpzRfJXFh", + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__4WKe5SVgEKrCZexAT3iUkDqWWcTbaENsC5HwSK4ZTLhF", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__GESy939vvVaiE8opgpbpkUofpw4VDnJUvzFnpzRfJXFh", + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__4WKe5SVgEKrCZexAT3iUkDqWWcTbaENsC5HwSK4ZTLhF", "type": "integer", - "value": 889330289 + "value": 948221917 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__HGxVD8vNY1VobYyfntgwckYYSoDyA8xSnW43ZPvr6hRx", + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__5pQH4TWKJvruXuwNpHDcYpQk34wHUNVUHTcaYyDmZzFG", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__HGxVD8vNY1VobYyfntgwckYYSoDyA8xSnW43ZPvr6hRx", + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__5pQH4TWKJvruXuwNpHDcYpQk34wHUNVUHTcaYyDmZzFG", "type": "integer", - "value": 1027092734 + "value": 836139448 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__J4xA8ddnKrGBU6iYPuK2QcPT5jc9qX1izUsB1vojdJJd", + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__7fvT8A1jzLFM3h1EJjhAvS4KLa3eLkJMoGKdusXV6MsD", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__J4xA8ddnKrGBU6iYPuK2QcPT5jc9qX1izUsB1vojdJJd", + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__7fvT8A1jzLFM3h1EJjhAvS4KLa3eLkJMoGKdusXV6MsD", "type": "integer", - "value": 951730963 + "value": 2447716766 }, { - "key": "%s%s%s__withdrawal__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__JnoWeweTGyCj3DoAKVi5aExrVoZbUqUyMYZp52Fn9Jw", + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__7qfu5uNDVj8jYLVMQs3fuGDLDvTAWzVicgJeFDPLiZXy", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja__JnoWeweTGyCj3DoAKVi5aExrVoZbUqUyMYZp52Fn9Jw", + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__7qfu5uNDVj8jYLVMQs3fuGDLDvTAWzVicgJeFDPLiZXy", "type": "integer", - "value": 1028620019 + "value": 5040352822 }, { - "key": "%s%s%s__withdrawal__3P6FjQcHZNggULXG8twvbjpsT1sBU8Sh2yv__HnPo6axXmi3eMDRBiq6bdkTXVxymMUW2dWPKHAHdMLom", + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__8VboUZtkyb1p3EYbGsQmRFYcnpCLHuTKSu24662jjHDw", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6FjQcHZNggULXG8twvbjpsT1sBU8Sh2yv__HnPo6axXmi3eMDRBiq6bdkTXVxymMUW2dWPKHAHdMLom", + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__8VboUZtkyb1p3EYbGsQmRFYcnpCLHuTKSu24662jjHDw", "type": "integer", - "value": 505676149 + "value": 5368497816 }, { - "key": "%s%s%s__withdrawal__3P6Qdw4cuT9dvTHaHLRJ2iordKyMKJZqUg9__6kPAxnaGt3Gocd66E5bQXtrJdtXC4ohfC4azv2xwBaQR", + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__8keoiqVV7CFH1uaXcDsEZhbQWpHb7ivG6LmU55zKDeTZ", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6Qdw4cuT9dvTHaHLRJ2iordKyMKJZqUg9__6kPAxnaGt3Gocd66E5bQXtrJdtXC4ohfC4azv2xwBaQR", + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__8keoiqVV7CFH1uaXcDsEZhbQWpHb7ivG6LmU55zKDeTZ", "type": "integer", - "value": 117647058 + "value": 877626342 }, { - "key": "%s%s%s__withdrawal__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__8gpbhCu8HYNScTsYbvLjkAtedteXAUAAwSK8BxdBhAGY", + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__9Vib76kWbBpFEVx4ZQFAaspJpvc5Zsd7RgCU3zt5KUCb", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__8gpbhCu8HYNScTsYbvLjkAtedteXAUAAwSK8BxdBhAGY", + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__9Vib76kWbBpFEVx4ZQFAaspJpvc5Zsd7RgCU3zt5KUCb", "type": "integer", - "value": 170142172 + "value": 952908378 }, { - "key": "%s%s%s__withdrawal__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__9CZkDQLQ2vh3coEHHDdhCqBDQFEm3FW3GKr4TCQ8rhn7", + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__CAhRoF7KXd7cDnXk31yvUYekJPjYqE7HdnM7EB3iKehV", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__9CZkDQLQ2vh3coEHHDdhCqBDQFEm3FW3GKr4TCQ8rhn7", + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__CAhRoF7KXd7cDnXk31yvUYekJPjYqE7HdnM7EB3iKehV", "type": "integer", - "value": 50000000 + "value": 818033805 }, { - "key": "%s%s%s__withdrawal__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__HdRM9vxYaWQwB5hRLYGVSDbH9BQqwksWcKFAidTv5G2z", + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__Cwi2Zp5H8ZkV1oDJ5jnKnWmRXJbfAjdyU6TV5JtontvP", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6gVho3EXsGxijNFeHQZtUq1vjdbJVd5W9__HdRM9vxYaWQwB5hRLYGVSDbH9BQqwksWcKFAidTv5G2z", + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__Cwi2Zp5H8ZkV1oDJ5jnKnWmRXJbfAjdyU6TV5JtontvP", "type": "integer", - "value": 300000000 + "value": 6971318575 }, { - "key": "%s%s%s__withdrawal__3P6hUJtfEgFrRpdYgamDRKHqS6taW49REJ2__6vYZjU2j13VtxV62dQqNqs1CYCjvR9Z4iqGmvWJ2LrES", + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__EcnS5iicxCTMmmHsgvPnkjh85EkXidcLcvE5goSeRMkr", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6hUJtfEgFrRpdYgamDRKHqS6taW49REJ2__6vYZjU2j13VtxV62dQqNqs1CYCjvR9Z4iqGmvWJ2LrES", + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__EcnS5iicxCTMmmHsgvPnkjh85EkXidcLcvE5goSeRMkr", "type": "integer", - "value": 50000000000 + "value": 1041600762 }, { - "key": "%s%s%s__withdrawal__3P6hUJtfEgFrRpdYgamDRKHqS6taW49REJ2__Dr6Wq5WvLdziMi2R1J2UX5umwG6fYoUN9z34dXw1iy6r", + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__F8rSHY3yNMMYY8XkBh8QSC1HyVsNMAFnqXZgk5wDEAuw", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6hUJtfEgFrRpdYgamDRKHqS6taW49REJ2__Dr6Wq5WvLdziMi2R1J2UX5umwG6fYoUN9z34dXw1iy6r", + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__F8rSHY3yNMMYY8XkBh8QSC1HyVsNMAFnqXZgk5wDEAuw", "type": "integer", - "value": 61350477191 + "value": 895971095 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__14MNmFNyk2t8KtUHLyk2m91DevYRARjbSZU3eKadrGep", + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__HsPbzuB3n9RR4xfeJustcUWhJ6jff9WTkPZL4jR1sDwM", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__14MNmFNyk2t8KtUHLyk2m91DevYRARjbSZU3eKadrGep", + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__HsPbzuB3n9RR4xfeJustcUWhJ6jff9WTkPZL4jR1sDwM", "type": "integer", - "value": 11155060 + "value": 969197240 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__2GQ1mJ5pZSEqUTCe7LgkQDZJFh2aHG45eYKVQHbebfsx", + "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__wxp9E9tEpd4mncxTFSkqbXY9A1TppF2Ke51JFpkVjnT", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__2GQ1mJ5pZSEqUTCe7LgkQDZJFh2aHG45eYKVQHbebfsx", + "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__wxp9E9tEpd4mncxTFSkqbXY9A1TppF2Ke51JFpkVjnT", "type": "integer", - "value": 11607599 + "value": 991072029 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__2NsKDKkrisvyN2T2ErCRz1LPGFEwkqWBg49tLDKa2YRT", + "key": "%s%s%s__withdrawal__3PFvxLPUxCY9Et5uyfkYLE4SDZ5oJTCFWsG__86yvd4JHwPtS322ZEkV6B4HCs6L9jYDWukT47FjuYDJX", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__2NsKDKkrisvyN2T2ErCRz1LPGFEwkqWBg49tLDKa2YRT", + "key": "%s%s%s__withdrawalHistory__3PFvxLPUxCY9Et5uyfkYLE4SDZ5oJTCFWsG__86yvd4JHwPtS322ZEkV6B4HCs6L9jYDWukT47FjuYDJX", "type": "integer", - "value": 44720723 + "value": 100000000 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__32Ymhko3cgSembEJZPD5NYwqLYdkPoAJR74cvhctR1Ei", + "key": "%s%s%s__withdrawal__3PFvxLPUxCY9Et5uyfkYLE4SDZ5oJTCFWsG__DEAxHFsgHCWipYK6NB5HndRrJqQrMHML37QEp8FkeC23", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__32Ymhko3cgSembEJZPD5NYwqLYdkPoAJR74cvhctR1Ei", + "key": "%s%s%s__withdrawalHistory__3PFvxLPUxCY9Et5uyfkYLE4SDZ5oJTCFWsG__DEAxHFsgHCWipYK6NB5HndRrJqQrMHML37QEp8FkeC23", "type": "integer", - "value": 11052125 + "value": 47466546112 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__39ntEbBKDzgvNTSE7RDMwD3tgdbsERGcKZrJEbwZkZ94", + "key": "%s%s%s__withdrawal__3PFwm8UvcfcFUMLsxN2W3djtBgB1SPNBqRL__8ESBwLfuPzVx4ZACEKvMQ1RsMxLoYdqzWvyH4G462vuc", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__39ntEbBKDzgvNTSE7RDMwD3tgdbsERGcKZrJEbwZkZ94", + "key": "%s%s%s__withdrawalHistory__3PFwm8UvcfcFUMLsxN2W3djtBgB1SPNBqRL__8ESBwLfuPzVx4ZACEKvMQ1RsMxLoYdqzWvyH4G462vuc", "type": "integer", - "value": 11045845 + "value": 27000000000 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__3KnZFR3Huyz2uNM6nZ22ocWTt3eLAKhyS8kb8JeVRPNh", + "key": "%s%s%s__withdrawal__3PFwyK4WEDb2qQ1wPFxG5rzyz7x2G1byMXz__Cm5btuYg9pPpVBz3ZuetVnmhWwU4jcycBVPKu81gJUL4", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__3KnZFR3Huyz2uNM6nZ22ocWTt3eLAKhyS8kb8JeVRPNh", + "key": "%s%s%s__withdrawalHistory__3PFwyK4WEDb2qQ1wPFxG5rzyz7x2G1byMXz__Cm5btuYg9pPpVBz3ZuetVnmhWwU4jcycBVPKu81gJUL4", "type": "integer", - "value": 34312611 + "value": 10000000 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__3wGpq8LHt97qzSkLHPUeuC9sqdaMgTU6rtvPVBoiivXd", + "key": "%s%s%s__withdrawal__3PGDywXYEdWACTs8rksuX9dxS3uGoWQpPyb__9z8Av1yEvy3PSAiqJ2xEG17RMf1zRYsYUQg5CMyrkRg7", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__3wGpq8LHt97qzSkLHPUeuC9sqdaMgTU6rtvPVBoiivXd", + "key": "%s%s%s__withdrawalHistory__3PGDywXYEdWACTs8rksuX9dxS3uGoWQpPyb__9z8Av1yEvy3PSAiqJ2xEG17RMf1zRYsYUQg5CMyrkRg7", "type": "integer", - "value": 21617215 + "value": 5000000000 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4AhEYv63DtEQyL48rtf4ahPSvvnTVT449ucxcJ9Sgfeh", + "key": "%s%s%s__withdrawal__3PH152STC5wrrSfAzzFerES8fSZaDXjvGHN__MeUeMVfgkCLzBH5fYfaExCxq6VXcniyNuxoq7fnEHhy", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4AhEYv63DtEQyL48rtf4ahPSvvnTVT449ucxcJ9Sgfeh", + "key": "%s%s%s__withdrawalHistory__3PH152STC5wrrSfAzzFerES8fSZaDXjvGHN__MeUeMVfgkCLzBH5fYfaExCxq6VXcniyNuxoq7fnEHhy", "type": "integer", - "value": 47434526 + "value": 1885035978 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4c4ZiETv5DL6HRDstaUCunJv71fHDhYZo8rEr2EFTL29", + "key": "%s%s%s__withdrawal__3PH3K5hyTYgM7Knt4vaXb9vbYZUABJQAFse__fmCRyZEiZyh74rFFvKs5piprrHrkvKhpxpZkEkfjCYC", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4c4ZiETv5DL6HRDstaUCunJv71fHDhYZo8rEr2EFTL29", + "key": "%s%s%s__withdrawalHistory__3PH3K5hyTYgM7Knt4vaXb9vbYZUABJQAFse__fmCRyZEiZyh74rFFvKs5piprrHrkvKhpxpZkEkfjCYC", "type": "integer", - "value": 54722187 + "value": 154089136376 } ] } \ No newline at end of file diff --git a/migrations/withdrawals/factory_dataTx_2.json b/migrations/withdrawals/factory_dataTx_2.json index 3381fc4..e7606a7 100644 --- a/migrations/withdrawals/factory_dataTx_2.json +++ b/migrations/withdrawals/factory_dataTx_2.json @@ -5,454 +5,454 @@ "fee": 1500000, "data": [ { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4vzMaPsoiGFeMDdQaDyzwWFKwwtf5cJUqf3nG5SaytmZ", + "key": "%s%s%s__withdrawal__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ__6y3o7fQZhi6kfyGPsbKpqK74tEGNBzf4Sb15LQfkJEaX", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__4vzMaPsoiGFeMDdQaDyzwWFKwwtf5cJUqf3nG5SaytmZ", + "key": "%s%s%s__withdrawalHistory__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ__6y3o7fQZhi6kfyGPsbKpqK74tEGNBzf4Sb15LQfkJEaX", "type": "integer", - "value": 10550795 + "value": 25461374 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6cw3qwauTRAKEdDZamDRTWAeaDSFsSMXbM6MANG5u9Qq", + "key": "%s%s%s__withdrawal__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ__7sPzPdB2sCu7K2xK7est4NrBqCXjkKq3oiVE6j3Xspft", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6cw3qwauTRAKEdDZamDRTWAeaDSFsSMXbM6MANG5u9Qq", + "key": "%s%s%s__withdrawalHistory__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ__7sPzPdB2sCu7K2xK7est4NrBqCXjkKq3oiVE6j3Xspft", "type": "integer", - "value": 20562038 + "value": 100011502579 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6uiY1Z5gqRp7FBn9YBgiKHAFdHg5DXe2on4spNUTFH3j", + "key": "%s%s%s__withdrawal__3PHvG6exQVNMLfNKY61F7EdPz5ByadQMstu__HfBo5aXhynH5G5N6QS9edxaPD5upjUFcM1Mr9Dewwwww", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6uiY1Z5gqRp7FBn9YBgiKHAFdHg5DXe2on4spNUTFH3j", + "key": "%s%s%s__withdrawalHistory__3PHvG6exQVNMLfNKY61F7EdPz5ByadQMstu__HfBo5aXhynH5G5N6QS9edxaPD5upjUFcM1Mr9Dewwwww", "type": "integer", - "value": 21822738 + "value": 124206166 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6v7C9m3523e4JUNpfKimY9PorWwvL1xQ7HVw4THm48jE", + "key": "%s%s%s__withdrawal__3PJ4dDgEyksWRdDBrZkCjFrURTcGCk7WN1c__CNJtg4SKiRtYHCUtFqcL6McFEwivbTM8w1QvnSNdHBMC", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__6v7C9m3523e4JUNpfKimY9PorWwvL1xQ7HVw4THm48jE", + "key": "%s%s%s__withdrawalHistory__3PJ4dDgEyksWRdDBrZkCjFrURTcGCk7WN1c__CNJtg4SKiRtYHCUtFqcL6McFEwivbTM8w1QvnSNdHBMC", "type": "integer", - "value": 10421827 + "value": 13284185188 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__77KcZwNsJPV6E73gasL8thDHon5dzwCiYnDnFPGG8Hgs", + "key": "%s%s%s__withdrawal__3PJNxRGLG5wuuqcVjn7uviv4qaLfuq75xLH__4cdedswSNyVkYp3uYLk2wcTNgUtdsWh2qg5SPMNuTtrJ", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__77KcZwNsJPV6E73gasL8thDHon5dzwCiYnDnFPGG8Hgs", + "key": "%s%s%s__withdrawalHistory__3PJNxRGLG5wuuqcVjn7uviv4qaLfuq75xLH__4cdedswSNyVkYp3uYLk2wcTNgUtdsWh2qg5SPMNuTtrJ", "type": "integer", - "value": 11830993 + "value": 24517194 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__8rgoGNZ4wCHLfJUMPbRVuV81SUtAAauhqxWVB7VnEqD2", + "key": "%s%s%s__withdrawal__3PJNxRGLG5wuuqcVjn7uviv4qaLfuq75xLH__7V2PYFFNc6TE4qpLqKREEqucSTSVVbdHy8yFj7Gvtq1a", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__8rgoGNZ4wCHLfJUMPbRVuV81SUtAAauhqxWVB7VnEqD2", + "key": "%s%s%s__withdrawalHistory__3PJNxRGLG5wuuqcVjn7uviv4qaLfuq75xLH__7V2PYFFNc6TE4qpLqKREEqucSTSVVbdHy8yFj7Gvtq1a", "type": "integer", - "value": 31445997 + "value": 29861169 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__92Hzny8dLCbs3TLR9sLB4ezWSkiqPLWtPGTEnph8xWq2", + "key": "%s%s%s__withdrawal__3PJjnz3z24vwDResuNo4Bgth1rYRre267qj__ChmdhRHtUmM7rRhtBPEgzHWQMUNfcdWhpCLr3ZsD2cuL", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__92Hzny8dLCbs3TLR9sLB4ezWSkiqPLWtPGTEnph8xWq2", + "key": "%s%s%s__withdrawalHistory__3PJjnz3z24vwDResuNo4Bgth1rYRre267qj__ChmdhRHtUmM7rRhtBPEgzHWQMUNfcdWhpCLr3ZsD2cuL", "type": "integer", - "value": 21383312 + "value": 504850444 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__941zVpEYST1LgBfyT8YUbrZmfwtozkUNwsjV2R43NXz4", + "key": "%s%s%s__withdrawal__3PJjnz3z24vwDResuNo4Bgth1rYRre267qj__nmwa4843duu5nYoST9vouGKa8y4HwqAc12T3jHhPYB8", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__941zVpEYST1LgBfyT8YUbrZmfwtozkUNwsjV2R43NXz4", + "key": "%s%s%s__withdrawalHistory__3PJjnz3z24vwDResuNo4Bgth1rYRre267qj__nmwa4843duu5nYoST9vouGKa8y4HwqAc12T3jHhPYB8", "type": "integer", - "value": 132474262 + "value": 1057278448 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__AHBY2Zc6R1TgZHgJgiWZQxQQxPoR3Btn3XsFWdMoySfj", + "key": "%s%s%s__withdrawal__3PJqcYDtN8RFLWoJCSosrxjTptgV9JFnQtp__DCffPCZfZ6crHWQrP8WH3a1cCQv6AzTNSpLxZCRV4iej", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__AHBY2Zc6R1TgZHgJgiWZQxQQxPoR3Btn3XsFWdMoySfj", + "key": "%s%s%s__withdrawalHistory__3PJqcYDtN8RFLWoJCSosrxjTptgV9JFnQtp__DCffPCZfZ6crHWQrP8WH3a1cCQv6AzTNSpLxZCRV4iej", "type": "integer", - "value": 36556671 + "value": 2212261405 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__ATHVkJeA2YnRJbzm9hg9BMc8KZUMAXyQxjsyGL33pZSA", + "key": "%s%s%s__withdrawal__3PLBFxFwMgTNPptA8RnygTpPYazoWeSf3BS__5vcyoTeY7MtjDbD4YquDzdghqxbYBiznzQGtrTmLaYYf", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__ATHVkJeA2YnRJbzm9hg9BMc8KZUMAXyQxjsyGL33pZSA", + "key": "%s%s%s__withdrawalHistory__3PLBFxFwMgTNPptA8RnygTpPYazoWeSf3BS__5vcyoTeY7MtjDbD4YquDzdghqxbYBiznzQGtrTmLaYYf", "type": "integer", - "value": 55109731 + "value": 5131396987 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__AWca94muiRNn9ae2r1LSseyJjUXp7ohRiz1RJQF9HMAr", + "key": "%s%s%s__withdrawal__3PLBFxFwMgTNPptA8RnygTpPYazoWeSf3BS__FmjNfBKycYTU9USTmyEVnToNanKdpBqzM4ShShvG8vi5", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__AWca94muiRNn9ae2r1LSseyJjUXp7ohRiz1RJQF9HMAr", + "key": "%s%s%s__withdrawalHistory__3PLBFxFwMgTNPptA8RnygTpPYazoWeSf3BS__FmjNfBKycYTU9USTmyEVnToNanKdpBqzM4ShShvG8vi5", "type": "integer", - "value": 11956841 + "value": 2214188025 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__At2FQ1WJJfN4p6AjFLvTpkDSZC9g1zPuDW1y251AErWF", + "key": "%s%s%s__withdrawal__3PLTWcc26QWMkrmRvYqBkn6hTfwpmGRXTun__6HXFMAMEPXWXRToG6NTUYdYNCtjVhGjzgRRcLdqoJm8Q", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__At2FQ1WJJfN4p6AjFLvTpkDSZC9g1zPuDW1y251AErWF", + "key": "%s%s%s__withdrawalHistory__3PLTWcc26QWMkrmRvYqBkn6hTfwpmGRXTun__6HXFMAMEPXWXRToG6NTUYdYNCtjVhGjzgRRcLdqoJm8Q", "type": "integer", - "value": 44673206 + "value": 11491448494 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__B85FjvA7iWnFXx7qPX3c5MJmWmR1URixTaqfWmDQsWo7", + "key": "%s%s%s__withdrawal__3PLTWcc26QWMkrmRvYqBkn6hTfwpmGRXTun__8EiiCbEB81B4nGb275pD469tdUmmwqtHTeGGv9mWnUKi", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__B85FjvA7iWnFXx7qPX3c5MJmWmR1URixTaqfWmDQsWo7", + "key": "%s%s%s__withdrawalHistory__3PLTWcc26QWMkrmRvYqBkn6hTfwpmGRXTun__8EiiCbEB81B4nGb275pD469tdUmmwqtHTeGGv9mWnUKi", "type": "integer", - "value": 11585113 + "value": 9005898638 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__BMKBNv8WiZ5CqbZoUvZndxNmxMNQsxxeVjxedy7geuVs", + "key": "%s%s%s__withdrawal__3PLfnQ8fCS2nyFdUh2Fmp8dJN7fs69jAhA5__8bN6rSyBPkX1QdKMEnNhkCRCWNZKVhnYJuxqMCn6G2iJ", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__BMKBNv8WiZ5CqbZoUvZndxNmxMNQsxxeVjxedy7geuVs", + "key": "%s%s%s__withdrawalHistory__3PLfnQ8fCS2nyFdUh2Fmp8dJN7fs69jAhA5__8bN6rSyBPkX1QdKMEnNhkCRCWNZKVhnYJuxqMCn6G2iJ", "type": "integer", - "value": 9754716 + "value": 21219694522 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__BV4txM2dwUNqYFwF5nMgH2K62iZxoXAdp6fEBk4magv5", + "key": "%s%s%s__withdrawal__3PLfnQ8fCS2nyFdUh2Fmp8dJN7fs69jAhA5__GduqkYkLFpt7Y1BncCJMViiTH3ojdqbVKHzTuSEdZHFE", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__BV4txM2dwUNqYFwF5nMgH2K62iZxoXAdp6fEBk4magv5", + "key": "%s%s%s__withdrawalHistory__3PLfnQ8fCS2nyFdUh2Fmp8dJN7fs69jAhA5__GduqkYkLFpt7Y1BncCJMViiTH3ojdqbVKHzTuSEdZHFE", "type": "integer", - "value": 21146673 + "value": 100000000 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__CA31WHmwpFEzQuPykdivdPuCcdThZX2BRstAXNZeybCQ", + "key": "%s%s%s__withdrawal__3PMdqvU8tP5zBi4wEEFpaoNmvwXoqkkyYQS__HiAFnb8esSwj77Abn3LZjS5PiFnfi2QmPVyCwv2KJawb", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__CA31WHmwpFEzQuPykdivdPuCcdThZX2BRstAXNZeybCQ", + "key": "%s%s%s__withdrawalHistory__3PMdqvU8tP5zBi4wEEFpaoNmvwXoqkkyYQS__HiAFnb8esSwj77Abn3LZjS5PiFnfi2QmPVyCwv2KJawb", "type": "integer", - "value": 10882930 + "value": 10640600586 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__CYgbjMkMCK5YCGwnP7dpWkjaVKe8aWB4U7BNi9LG9YRT", + "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__6f4izjAtjTyz49srEFkDYQKg3VZh85MrGaqD5853uRr9", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__CYgbjMkMCK5YCGwnP7dpWkjaVKe8aWB4U7BNi9LG9YRT", + "key": "%s%s%s__withdrawalHistory__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__6f4izjAtjTyz49srEFkDYQKg3VZh85MrGaqD5853uRr9", "type": "integer", - "value": 31140432 + "value": 150000000000 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Cdq4qBLnViYKzsKhqyB47wADGnS45GYd63r7Ydg79n56", + "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__AHQJMxSgrCkevZNWzBCcik2CT971kuRiQGWQfq2Z2Et4", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Cdq4qBLnViYKzsKhqyB47wADGnS45GYd63r7Ydg79n56", + "key": "%s%s%s__withdrawalHistory__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__AHQJMxSgrCkevZNWzBCcik2CT971kuRiQGWQfq2Z2Et4", "type": "integer", - "value": 32511134 + "value": 102000000000 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Cneat15RX9p4WjzAvHqY3AQ1CFLUmmEr6CW76XHKBBwh", + "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__HMxC1o7rAnWDSXqeqWT9GnPWxTbF9GWXRGPRVHi3DgGy", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Cneat15RX9p4WjzAvHqY3AQ1CFLUmmEr6CW76XHKBBwh", + "key": "%s%s%s__withdrawalHistory__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__HMxC1o7rAnWDSXqeqWT9GnPWxTbF9GWXRGPRVHi3DgGy", "type": "integer", - "value": 66369995 + "value": 112000000000 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DJXt7fBgBgHt9YCrjFyJJCgx4kzWM4tAPu1oNwBomQZZ", + "key": "%s%s%s__withdrawal__3PN2JRxJxjjZo1YJGyQrxdhoEbijc24BMY3__2tJMUah5hfeYuEoRrCFTKz18DSkqoguY3b9LweSfobKW", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DJXt7fBgBgHt9YCrjFyJJCgx4kzWM4tAPu1oNwBomQZZ", + "key": "%s%s%s__withdrawalHistory__3PN2JRxJxjjZo1YJGyQrxdhoEbijc24BMY3__2tJMUah5hfeYuEoRrCFTKz18DSkqoguY3b9LweSfobKW", "type": "integer", - "value": 21230274 + "value": 100000000 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DXZCNwUeZkk7754bsyrmVMxjrUwsFicGxrkE8GdHcrv5", + "key": "%s%s%s__withdrawal__3PNMYZEJvMFpsAtuGszT4pmZkGuq6wkm2C3__7r4aeFjEN8xQ9FUTDxWVLGsh6Sjmcodppxu1QQ159nrH", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DXZCNwUeZkk7754bsyrmVMxjrUwsFicGxrkE8GdHcrv5", + "key": "%s%s%s__withdrawalHistory__3PNMYZEJvMFpsAtuGszT4pmZkGuq6wkm2C3__7r4aeFjEN8xQ9FUTDxWVLGsh6Sjmcodppxu1QQ159nrH", "type": "integer", - "value": 31585209 + "value": 2511376 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DkrEHjfZRsiJ4MFKXLXi7ejkuV9YeLttehRgWGKJuPYx", + "key": "%s%s%s__withdrawal__3PNMYZEJvMFpsAtuGszT4pmZkGuq6wkm2C3__9JZcvCkjkjwrrGXfUjdWS8cgVQs9dGnYK3fxtqwuKLao", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__DkrEHjfZRsiJ4MFKXLXi7ejkuV9YeLttehRgWGKJuPYx", + "key": "%s%s%s__withdrawalHistory__3PNMYZEJvMFpsAtuGszT4pmZkGuq6wkm2C3__9JZcvCkjkjwrrGXfUjdWS8cgVQs9dGnYK3fxtqwuKLao", "type": "integer", - "value": 32480652 + "value": 1464210 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__E8HtDHKoVFWtMqTmGGCaDHiwyKnVQDB7dSbMo8Yqn7YU", + "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__33iZJHJMKsjUk5H8YqhBZxSD2DKRiCmNrqHHe5E4qauN", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__E8HtDHKoVFWtMqTmGGCaDHiwyKnVQDB7dSbMo8Yqn7YU", + "key": "%s%s%s__withdrawalHistory__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__33iZJHJMKsjUk5H8YqhBZxSD2DKRiCmNrqHHe5E4qauN", "type": "integer", - "value": 11015396 + "value": 264973207 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__EYZvJcSrGw53UQ5U8h1sN1Qii3kqYMCoGs16gEKbdPPM", + "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__Akfx7XfCpbux94eJ8iK4WS5AxJQTbZU3ksfVWaYmaoWm", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__EYZvJcSrGw53UQ5U8h1sN1Qii3kqYMCoGs16gEKbdPPM", + "key": "%s%s%s__withdrawalHistory__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__Akfx7XfCpbux94eJ8iK4WS5AxJQTbZU3ksfVWaYmaoWm", "type": "integer", - "value": 10679925 + "value": 352096109 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__EnPouN7N3qx8mrHKASvcTmwCBTZ9FnbNHi6GybYh48h9", + "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__BtFtoTvrydPWPVNjCfuKSFfLG1qmosoxRX5Po93CUAd7", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__EnPouN7N3qx8mrHKASvcTmwCBTZ9FnbNHi6GybYh48h9", + "key": "%s%s%s__withdrawalHistory__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__BtFtoTvrydPWPVNjCfuKSFfLG1qmosoxRX5Po93CUAd7", "type": "integer", - "value": 11421728 + "value": 397158954 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Erorejb3kVNiehjmq8WcAmvzkr1VePZ5acc4wqsQsqRx", + "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__CEiaGJM3QMPCiwst4VodF61F1dx4CuPiJ5LiWuyb96Dn", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Erorejb3kVNiehjmq8WcAmvzkr1VePZ5acc4wqsQsqRx", + "key": "%s%s%s__withdrawalHistory__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__CEiaGJM3QMPCiwst4VodF61F1dx4CuPiJ5LiWuyb96Dn", "type": "integer", - "value": 10239135 + "value": 410380041 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FAENNsNDm6qH79hfXWVMLStuqwAxuc9zrYuvyiCXc5TZ", + "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__2ebkb2cLaZXmyEisyTnBizosMSdm1hWU1TVePWZCJ5fF", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FAENNsNDm6qH79hfXWVMLStuqwAxuc9zrYuvyiCXc5TZ", + "key": "%s%s%s__withdrawalHistory__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__2ebkb2cLaZXmyEisyTnBizosMSdm1hWU1TVePWZCJ5fF", "type": "integer", - "value": 10192005 + "value": 4720830954 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FFPDUF1XAGWkg5wt9PHbscwZ48ZrGFqYQMmWMxR57s3s", + "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__B6xmUHwecRUDQa2NTJDwL4WqmJCGaV5AaaAT3Pgt2RF6", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FFPDUF1XAGWkg5wt9PHbscwZ48ZrGFqYQMmWMxR57s3s", + "key": "%s%s%s__withdrawalHistory__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__B6xmUHwecRUDQa2NTJDwL4WqmJCGaV5AaaAT3Pgt2RF6", "type": "integer", - "value": 10943431 + "value": 3722048229 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FKWHB3Q1sQqG65exiD2VFiyFpkt9Hj2mJpmu1xGWuf1V", + "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__BNUreyUB7YSPWWrMicjGzgt9wxzAkAco2MK7kGQBysYe", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FKWHB3Q1sQqG65exiD2VFiyFpkt9Hj2mJpmu1xGWuf1V", + "key": "%s%s%s__withdrawalHistory__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__BNUreyUB7YSPWWrMicjGzgt9wxzAkAco2MK7kGQBysYe", "type": "integer", - "value": 33455112 + "value": 4949999601 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FREsEwm5EPC5TZDdE26Fup8Miey2D63HT5DLPBgf8U6y", + "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__H1R65xBvcB1fLwRBvfXYFjpuMGkL35FFicaj1cqvK55g", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FREsEwm5EPC5TZDdE26Fup8Miey2D63HT5DLPBgf8U6y", + "key": "%s%s%s__withdrawalHistory__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__H1R65xBvcB1fLwRBvfXYFjpuMGkL35FFicaj1cqvK55g", "type": "integer", - "value": 22434911 + "value": 859876593 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FbuJGXB8pWKFc8sudqcfFgQRQFdJbW41ZaZ1vhsn848K", + "key": "%s%s%s__withdrawal__3PPF9dNLQxrg6ARTkNnSuo6rAhuDo68YQ7r__EApLgiPoLyHpBiBqXnyjVi9LpnpTzbLdKBsiZSLMbqjf", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__FbuJGXB8pWKFc8sudqcfFgQRQFdJbW41ZaZ1vhsn848K", + "key": "%s%s%s__withdrawalHistory__3PPF9dNLQxrg6ARTkNnSuo6rAhuDo68YQ7r__EApLgiPoLyHpBiBqXnyjVi9LpnpTzbLdKBsiZSLMbqjf", "type": "integer", - "value": 22737478 + "value": 4705014510 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__GdJrY7AHfc5n6c46fa5gmhP4v8jq7LuVrSuw9njq1pST", + "key": "%s%s%s__withdrawal__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__9Diy1w6Mj2NHgdMB5PvbESzuki1DN8P86PFv9qeykAP7", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__GdJrY7AHfc5n6c46fa5gmhP4v8jq7LuVrSuw9njq1pST", + "key": "%s%s%s__withdrawalHistory__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__9Diy1w6Mj2NHgdMB5PvbESzuki1DN8P86PFv9qeykAP7", "type": "integer", - "value": 22299930 + "value": 58973700 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Gs1xvTKNRwtoHHPhFxze1VkbTj5bWWPoU8G4bpe25eWr", + "key": "%s%s%s__withdrawal__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__F5arLeYN68LYMDJz7EXHyouk7WcAtUNtuMZs3ejZm3F4", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Gs1xvTKNRwtoHHPhFxze1VkbTj5bWWPoU8G4bpe25eWr", + "key": "%s%s%s__withdrawalHistory__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__F5arLeYN68LYMDJz7EXHyouk7WcAtUNtuMZs3ejZm3F4", "type": "integer", - "value": 15842779 + "value": 245284462 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__GzePPYLLxpmc3DEu7sixWi1qxR5fQERrsewcAqwEjt5L", + "key": "%s%s%s__withdrawal__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__HjHFEAS7pz8J8HLmgBS7rZqzXsu9Yti1JASsSrWRveWr", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__GzePPYLLxpmc3DEu7sixWi1qxR5fQERrsewcAqwEjt5L", + "key": "%s%s%s__withdrawalHistory__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__HjHFEAS7pz8J8HLmgBS7rZqzXsu9Yti1JASsSrWRveWr", "type": "integer", - "value": 12307197 + "value": 126448836 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Hyiz1vqr1XQcBcECFPAagHszFoSSn1YeC6VbzKZBHG8U", + "key": "%s%s%s__withdrawal__3PPPTqGUYHJUYqKkRCV3kAS44guun9iN7J8__Aquz2sGoefWKdV6ER1xJeepHR8yUvP4V1Fp4ixRzH25G", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__Hyiz1vqr1XQcBcECFPAagHszFoSSn1YeC6VbzKZBHG8U", + "key": "%s%s%s__withdrawalHistory__3PPPTqGUYHJUYqKkRCV3kAS44guun9iN7J8__Aquz2sGoefWKdV6ER1xJeepHR8yUvP4V1Fp4ixRzH25G", "type": "integer", - "value": 26720291 + "value": 57668312500 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__J8i5eX95KhxbYoH6Mrq69eBmafwQsuFDMNU26u5fGyui", + "key": "%s%s%s__withdrawal__3PPVhnD2CG64dvGrKcXabDyg9zMyvwXQkA4__8Tfk3vV78xCGEYWwz8aUPsWdym4AgUPjMenKZh93VD8q", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__J8i5eX95KhxbYoH6Mrq69eBmafwQsuFDMNU26u5fGyui", + "key": "%s%s%s__withdrawalHistory__3PPVhnD2CG64dvGrKcXabDyg9zMyvwXQkA4__8Tfk3vV78xCGEYWwz8aUPsWdym4AgUPjMenKZh93VD8q", "type": "integer", - "value": 11568077 + "value": 582547612 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__vT6ohBw6F6teDKpcPobXrgKbgChbkKUVw37sxma7rnH", + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__6j9z4RYqcE5jLq9dNWVnirXXiJ8vdyUv2ReJBDjqD9xX", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__vT6ohBw6F6teDKpcPobXrgKbgChbkKUVw37sxma7rnH", + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__6j9z4RYqcE5jLq9dNWVnirXXiJ8vdyUv2ReJBDjqD9xX", "type": "integer", - "value": 44845253 + "value": 794114838 }, { - "key": "%s%s%s__withdrawal__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__xz1TtVTA16Y4JvgPuSW94vqytyecMvT8XWyoMadWi33", + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__8hddFNEJ3Qt4yHUKexAE7nddnRhT9gD5vRdGVvWcMzux", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6peaRNdwCH1wh9qSrhFSn8VqepEPk8a7C__xz1TtVTA16Y4JvgPuSW94vqytyecMvT8XWyoMadWi33", + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__8hddFNEJ3Qt4yHUKexAE7nddnRhT9gD5vRdGVvWcMzux", "type": "integer", - "value": 32532051 + "value": 1127422959 }, { - "key": "%s%s%s__withdrawal__3P6waUhBFADThmgZ9r9ouCrrBG2bUGjdDbU__DBFAumkaXvAFyi3RsVbV1UfkaRFkobCzRtuTgkRPKNsC", + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__AQeSJmdEX9BM5R3LACFdiCHY8F7XgdoCspZJbGgtBPXm", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6waUhBFADThmgZ9r9ouCrrBG2bUGjdDbU__DBFAumkaXvAFyi3RsVbV1UfkaRFkobCzRtuTgkRPKNsC", + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__AQeSJmdEX9BM5R3LACFdiCHY8F7XgdoCspZJbGgtBPXm", "type": "integer", - "value": 110138935 + "value": 1112701754 }, { - "key": "%s%s%s__withdrawal__3P6waUhBFADThmgZ9r9ouCrrBG2bUGjdDbU__FSgYRp45BGE4jBtdgAFFgHXqnGnNvucBSbpwk3Gs5v71", + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__C5i6YLpJwctyXrHYQ2wc1t1pv6mSVvJ93DH4yxnD73xQ", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P6waUhBFADThmgZ9r9ouCrrBG2bUGjdDbU__FSgYRp45BGE4jBtdgAFFgHXqnGnNvucBSbpwk3Gs5v71", + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__C5i6YLpJwctyXrHYQ2wc1t1pv6mSVvJ93DH4yxnD73xQ", "type": "integer", - "value": 2651628247 + "value": 290121282 }, { - "key": "%s%s%s__withdrawal__3P7LBLiPjMKP1jeRXnp1LvW5dwMTU3AtyBF__BtGFmASgvxCqKRZoA9eHCkxNJu6vjPRAJHbyH8dWcP4b", + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__C6benzi7c8F638LWtTMxz8MbRTv8EC7G7TrzJNAkL7hN", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P7LBLiPjMKP1jeRXnp1LvW5dwMTU3AtyBF__BtGFmASgvxCqKRZoA9eHCkxNJu6vjPRAJHbyH8dWcP4b", + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__C6benzi7c8F638LWtTMxz8MbRTv8EC7G7TrzJNAkL7hN", "type": "integer", - "value": 13066160366 + "value": 3807508493 }, { - "key": "%s%s%s__withdrawal__3P7X9caDLcngjaAqCjwQjzkgMuVoTKNav72__AKuQopJtmx7etmQTv1a8SCnb6PbXNysHGCpWbWGYoq36", + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__EuaDZJsUjWcMyMUxKLrCAAZEFut7MDAb3hx7MK2WKXoo", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P7X9caDLcngjaAqCjwQjzkgMuVoTKNav72__AKuQopJtmx7etmQTv1a8SCnb6PbXNysHGCpWbWGYoq36", + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__EuaDZJsUjWcMyMUxKLrCAAZEFut7MDAb3hx7MK2WKXoo", "type": "integer", - "value": 94984 + "value": 1388252316 }, { - "key": "%s%s%s__withdrawal__3P7mqPfcMt4GeBE1U8gF9jgpCT9T85fSK4f__7pyUvTQWYjxQVJDMeVThCeouMHTTKhq4bBZU5RRJR7bL", + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__FYA2ByvLvACU5WwQvdU7wH1ViJmMGQUxgLF4KhU2Lg9E", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P7mqPfcMt4GeBE1U8gF9jgpCT9T85fSK4f__7pyUvTQWYjxQVJDMeVThCeouMHTTKhq4bBZU5RRJR7bL", + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__FYA2ByvLvACU5WwQvdU7wH1ViJmMGQUxgLF4KhU2Lg9E", "type": "integer", - "value": 100000000 + "value": 395958686 }, { - "key": "%s%s%s__withdrawal__3P83kwB2C5GmH7D1z1cwdjDMLvF4FZyhxZf__GcKq28ZCMrGqS5k29QEFpGxbwLssuUKQk8ydGQmqrLaH", + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__GetcvZmgP3jvFAwB7CvjBvPxArzxDCcRN14FhZKRh9Gq", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P83kwB2C5GmH7D1z1cwdjDMLvF4FZyhxZf__GcKq28ZCMrGqS5k29QEFpGxbwLssuUKQk8ydGQmqrLaH", + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__GetcvZmgP3jvFAwB7CvjBvPxArzxDCcRN14FhZKRh9Gq", "type": "integer", - "value": 14535961556 + "value": 436554860 }, { - "key": "%s%s%s__withdrawal__3P8bxPavni6rQjNXWFnP6Xw68Bb8gyAB3pb__AbhrfsEnNPKNNfd4UK7Vapi5Hu87HiJmuHYnSHcQZa1E", + "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__k7tCtzPDF7cV2ytLXqxgPfysczzJ2T2Moo4ViPKoALj", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P8bxPavni6rQjNXWFnP6Xw68Bb8gyAB3pb__AbhrfsEnNPKNNfd4UK7Vapi5Hu87HiJmuHYnSHcQZa1E", + "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__k7tCtzPDF7cV2ytLXqxgPfysczzJ2T2Moo4ViPKoALj", "type": "integer", - "value": 200576587496 + "value": 439418250 }, { - "key": "%s%s%s__withdrawal__3P8hEMtF3exJMnDSBUcAYF1mcCZg421nM8h__9EJnwzhRVjS7uysxeWkkSVYDVvpTk9AA9uGNg1jeQEk2", + "key": "%s%s%s__withdrawal__3PPaeRJpqdmWaNii5WvcvwmDteXZ8RkbTqA__2t3E4Y6TmgdCMn7UAjUQ97cGWgTRJdk6wEx3bkBBodJP", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P8hEMtF3exJMnDSBUcAYF1mcCZg421nM8h__9EJnwzhRVjS7uysxeWkkSVYDVvpTk9AA9uGNg1jeQEk2", + "key": "%s%s%s__withdrawalHistory__3PPaeRJpqdmWaNii5WvcvwmDteXZ8RkbTqA__2t3E4Y6TmgdCMn7UAjUQ97cGWgTRJdk6wEx3bkBBodJP", "type": "integer", - "value": 2849250000 + "value": 2852701640 }, { - "key": "%s%s%s__withdrawal__3P8hEMtF3exJMnDSBUcAYF1mcCZg421nM8h__AuLEZj1gAL8b1F6G6sYmL7oV6SMtY9LbQota5ytctrXZ", + "key": "%s%s%s__withdrawal__3PPoHiMrFPAKBsUKiBajVGzSrUGpz1hdJ7W__BhUKSTTLGA9G7R8PrYrLWtyHCXp5KcayxAJcpMUSGaV2", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P8hEMtF3exJMnDSBUcAYF1mcCZg421nM8h__AuLEZj1gAL8b1F6G6sYmL7oV6SMtY9LbQota5ytctrXZ", + "key": "%s%s%s__withdrawalHistory__3PPoHiMrFPAKBsUKiBajVGzSrUGpz1hdJ7W__BhUKSTTLGA9G7R8PrYrLWtyHCXp5KcayxAJcpMUSGaV2", "type": "integer", - "value": 7598000000 + "value": 744927014 }, { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__14k6HsyPZFyxdqrM7BUcaxKYzTp7ViaMemcMDzZLGhed", + "key": "%s%s%s__withdrawal__3PPoHiMrFPAKBsUKiBajVGzSrUGpz1hdJ7W__CCEu4evWfwPyqL84DWiUbEGvVMiny2HU6daC99Ypinjt", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__14k6HsyPZFyxdqrM7BUcaxKYzTp7ViaMemcMDzZLGhed", + "key": "%s%s%s__withdrawalHistory__3PPoHiMrFPAKBsUKiBajVGzSrUGpz1hdJ7W__CCEu4evWfwPyqL84DWiUbEGvVMiny2HU6daC99Ypinjt", "type": "integer", - "value": 545743672 + "value": 517848375 }, { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__2LbVFLoUhdppZpgUwy9MJ3ZMAtqHK7CsUd3To987xuFR", + "key": "%s%s%s__withdrawal__3PQBxD7LjHw9vag6XohS9QFs9EyFDBUWzA6__6oN7aQFiYSUVzWCjYHWGeVzYfVpCqBwiSqcZc1WNdZND", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__2LbVFLoUhdppZpgUwy9MJ3ZMAtqHK7CsUd3To987xuFR", + "key": "%s%s%s__withdrawalHistory__3PQBxD7LjHw9vag6XohS9QFs9EyFDBUWzA6__6oN7aQFiYSUVzWCjYHWGeVzYfVpCqBwiSqcZc1WNdZND", "type": "integer", - "value": 617266276 + "value": 6488412500 }, { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__3ATn6AGyCf5kh8dYPe3rgDLkbatAeCaK32rSZGb9Yw8N", + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__AJtPpEpBvuDwBKxMDdxLLFxF43Wvso4iLRjDxrevhnF7", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__3ATn6AGyCf5kh8dYPe3rgDLkbatAeCaK32rSZGb9Yw8N", + "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__AJtPpEpBvuDwBKxMDdxLLFxF43Wvso4iLRjDxrevhnF7", "type": "integer", - "value": 614580696 + "value": 1990048072 } ] } \ No newline at end of file diff --git a/migrations/withdrawals/factory_dataTx_3.json b/migrations/withdrawals/factory_dataTx_3.json index 011331a..e5acdad 100644 --- a/migrations/withdrawals/factory_dataTx_3.json +++ b/migrations/withdrawals/factory_dataTx_3.json @@ -2,457 +2,61 @@ "type": 12, "version": 2, "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", - "fee": 1500000, + "fee": 600000, "data": [ { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__4hfg1R9waj1cAfEi6eRJPPvravNPCwA9G199SsS5qzwu", + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__ApDtWNtZSFTZAZ5YhW1BWgtBJMaM35vseAZKno1kvqFb", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__4hfg1R9waj1cAfEi6eRJPPvravNPCwA9G199SsS5qzwu", + "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__ApDtWNtZSFTZAZ5YhW1BWgtBJMaM35vseAZKno1kvqFb", "type": "integer", - "value": 1028778611 + "value": 224432354 }, { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__6Cmf6GdFMdj7AAuDxgKvG27XTgqZULGhqL43TyFDMpTX", + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__BvPELHTyNfM9vFD7LZtNZ8Z5T9sghkRgPk78ciiLYekp", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__6Cmf6GdFMdj7AAuDxgKvG27XTgqZULGhqL43TyFDMpTX", + "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__BvPELHTyNfM9vFD7LZtNZ8Z5T9sghkRgPk78ciiLYekp", "type": "integer", - "value": 599590253 + "value": 1537932461 }, { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__6QN2kXp4tvvTqP4JvUFygnmEWtKUkNnzfYVBKKXBuotT", + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__CNdg1ue8v4KRoAotXfrvNMq6WWb4X1kwXPnWZgRAqLE5", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__6QN2kXp4tvvTqP4JvUFygnmEWtKUkNnzfYVBKKXBuotT", + "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__CNdg1ue8v4KRoAotXfrvNMq6WWb4X1kwXPnWZgRAqLE5", "type": "integer", - "value": 560637495 + "value": 3828673277 }, { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__7eHuVPzsHNwxApvoSNAQKZChnSfLimYEHePGxanQKuLd", + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__QGmkfh3gT7U2oUhyavSGq6x4i3qMz1oJcTnui1Wxodw", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__7eHuVPzsHNwxApvoSNAQKZChnSfLimYEHePGxanQKuLd", + "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__QGmkfh3gT7U2oUhyavSGq6x4i3qMz1oJcTnui1Wxodw", "type": "integer", - "value": 146163206 + "value": 5284407404 }, { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__9EgrGotLuM1Y32r5vp6EWKG5XCNNhvM8EG376J9TG83y", + "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__bD6dA8xv5Yh4vvY7MVEABy9X2YhKhM6xAZsntiEqj93", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__9EgrGotLuM1Y32r5vp6EWKG5XCNNhvM8EG376J9TG83y", + "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__bD6dA8xv5Yh4vvY7MVEABy9X2YhKhM6xAZsntiEqj93", "type": "integer", - "value": 579915894 + "value": 3554156418 }, { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__ACRqSLFin8iJCK9Qw7KK3zKqb1EPm2UDB4pjgxe3wNzo", + "key": "%s%s%s__withdrawal__3PQhGvLgHdUt4GviS8wX5ZwqAZQPv5mnUoi__HGBV4ro9G3WTUnUynnBWFhrW55NBSU9NgU9ZrHHLLMMX", "value": null }, { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__ACRqSLFin8iJCK9Qw7KK3zKqb1EPm2UDB4pjgxe3wNzo", + "key": "%s%s%s__withdrawalHistory__3PQhGvLgHdUt4GviS8wX5ZwqAZQPv5mnUoi__HGBV4ro9G3WTUnUynnBWFhrW55NBSU9NgU9ZrHHLLMMX", "type": "integer", - "value": 580103147 - }, - { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BDcbyemFLsjUuRFCMUAqwE7xGC7LaM879e6Gn9Npufyw", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BDcbyemFLsjUuRFCMUAqwE7xGC7LaM879e6Gn9Npufyw", - "type": "integer", - "value": 658998488 - }, - { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BV2WxGM3pKyZEttzGttTNP2dbTnJSF7T2L5pXCZoDG6g", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BV2WxGM3pKyZEttzGttTNP2dbTnJSF7T2L5pXCZoDG6g", - "type": "integer", - "value": 637796002 - }, - { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BeKUdUbavZxd1AtsvCMCEARDxPYHGS8Qz3XjSsq3umQ4", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__BeKUdUbavZxd1AtsvCMCEARDxPYHGS8Qz3XjSsq3umQ4", - "type": "integer", - "value": 609803464 - }, - { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__CbV1yHxfd6Ph9H4pHzFkFn71J5VFdhxjNaSuWYiRZmpA", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__CbV1yHxfd6Ph9H4pHzFkFn71J5VFdhxjNaSuWYiRZmpA", - "type": "integer", - "value": 569210696 - }, - { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__E8NRAF2Rur5f8SbxVBRpdEDioMANTxwuuKvLKD9WP2CN", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__E8NRAF2Rur5f8SbxVBRpdEDioMANTxwuuKvLKD9WP2CN", - "type": "integer", - "value": 590049936 - }, - { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__Gg3imMpwEf1LcR14hpeBXBEAsNiznVLpKJu85HfqcsZs", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__Gg3imMpwEf1LcR14hpeBXBEAsNiznVLpKJu85HfqcsZs", - "type": "integer", - "value": 597180780 - }, - { - "key": "%s%s%s__withdrawal__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__GxMdqYaQDJp9exxvHzGoVXATu8jjzZjaPvqC5W112FkA", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3P9EirJ8bP6cZWveaazWiLNChLignnWppne__GxMdqYaQDJp9exxvHzGoVXATu8jjzZjaPvqC5W112FkA", - "type": "integer", - "value": 568871116 - }, - { - "key": "%s%s%s__withdrawal__3PA65ZA2Cgu9jPJA3jS1Z4jxpZspxYAhevJ__2nL63FSg5rS7iZtwevPaM5q5zEhDAXA2XhmVTywxv2EJ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PA65ZA2Cgu9jPJA3jS1Z4jxpZspxYAhevJ__2nL63FSg5rS7iZtwevPaM5q5zEhDAXA2XhmVTywxv2EJ", - "type": "integer", - "value": 575712232118 - }, - { - "key": "%s%s%s__withdrawal__3PA65ZA2Cgu9jPJA3jS1Z4jxpZspxYAhevJ__DHccWbLzSVZSEmsnQRB1QvLKSs9cMM1xdoRpDatPTdqJ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PA65ZA2Cgu9jPJA3jS1Z4jxpZspxYAhevJ__DHccWbLzSVZSEmsnQRB1QvLKSs9cMM1xdoRpDatPTdqJ", - "type": "integer", - "value": 239494425 - }, - { - "key": "%s%s%s__withdrawal__3PAeLTZwJtvRWweZM4M9Jt2V4dVtTpXBCEK__8mjBv5gMedtUSCFnGVecBksdTkPckoDghHAeLsDC9SvF", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PAeLTZwJtvRWweZM4M9Jt2V4dVtTpXBCEK__8mjBv5gMedtUSCFnGVecBksdTkPckoDghHAeLsDC9SvF", - "type": "integer", - "value": 4514259699 - }, - { - "key": "%s%s%s__withdrawal__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__2KEK7eXFWHMBL4nJgh2SndecdG57aFdGDPGbBc4ACNGM", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__2KEK7eXFWHMBL4nJgh2SndecdG57aFdGDPGbBc4ACNGM", - "type": "integer", - "value": 2469350000 - }, - { - "key": "%s%s%s__withdrawal__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__8wkThDGqFhWVuAtbNGQQPhJHPfKj8h1iiR6Kgu5HCryg", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__8wkThDGqFhWVuAtbNGQQPhJHPfKj8h1iiR6Kgu5HCryg", - "type": "integer", - "value": 33204150000 - }, - { - "key": "%s%s%s__withdrawal__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__J8oh5hmM2U7B5Pwzjq4NLLpdN5BgmpVEBizKgTUesbBx", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PAoiQ4Re6rtvZFLshRRoZLcxjxpr4Fj74F__J8oh5hmM2U7B5Pwzjq4NLLpdN5BgmpVEBizKgTUesbBx", - "type": "integer", - "value": 9877400000 - }, - { - "key": "%s%s%s__withdrawal__3PAuU9oc5YmkoHnb4KQMCkxn9ebsykynBCH__3y7ki2i4hvmw675QPH7pG5m5dWoZUcDGvoaRizX67PRH", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PAuU9oc5YmkoHnb4KQMCkxn9ebsykynBCH__3y7ki2i4hvmw675QPH7pG5m5dWoZUcDGvoaRizX67PRH", - "type": "integer", - "value": 10000000000 - }, - { - "key": "%s%s%s__withdrawal__3PBVqECkRHz87gJRZpn7oyhFWjZF9vcDcsR__FNAp4dQfrcdRq4fCeQTwgRJbo8xrLarva9HPZttwmTVB", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PBVqECkRHz87gJRZpn7oyhFWjZF9vcDcsR__FNAp4dQfrcdRq4fCeQTwgRJbo8xrLarva9HPZttwmTVB", - "type": "integer", - "value": 90000000 - }, - { - "key": "%s%s%s__withdrawal__3PBbYtxa4fW8GM5xpqqCP4jyZmCwsNFoe5P__GZMEGN138VLKKzbijnx9HjpVvXCuj28xqVa6JFvpHqms", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PBbYtxa4fW8GM5xpqqCP4jyZmCwsNFoe5P__GZMEGN138VLKKzbijnx9HjpVvXCuj28xqVa6JFvpHqms", - "type": "integer", - "value": 6215937909 - }, - { - "key": "%s%s%s__withdrawal__3PBitcoinAVGJvpSe6jevepPbT3M8SoMZjb__D4sr8JiTHeMZ1dgvc4ubG8U26Vf7sQ3d6x7LuVEawDFY", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PBitcoinAVGJvpSe6jevepPbT3M8SoMZjb__D4sr8JiTHeMZ1dgvc4ubG8U26Vf7sQ3d6x7LuVEawDFY", - "type": "integer", - "value": 4159587500 - }, - { - "key": "%s%s%s__withdrawal__3PCLkgzwEY71DDLtkPYAs1gsbbJoqmiqn62__2waf3wGnXM8h7fEJ9iWS5mcczeLj6e6gDWRA8ZALN7mC", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PCLkgzwEY71DDLtkPYAs1gsbbJoqmiqn62__2waf3wGnXM8h7fEJ9iWS5mcczeLj6e6gDWRA8ZALN7mC", - "type": "integer", - "value": 11621912872 - }, - { - "key": "%s%s%s__withdrawal__3PCLkgzwEY71DDLtkPYAs1gsbbJoqmiqn62__4BMq52B44fjuFLR2GXrmmY8F7FnqXE3HCaF2Vx8EUrMh", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PCLkgzwEY71DDLtkPYAs1gsbbJoqmiqn62__4BMq52B44fjuFLR2GXrmmY8F7FnqXE3HCaF2Vx8EUrMh", - "type": "integer", - "value": 2817361866 - }, - { - "key": "%s%s%s__withdrawal__3PCQiEJsERrUyrVV2551MNs4eSDAhgQg5e4__4YRqUYuVZaBNPi9ekTHaVWgpox72qmUZk9bRq41WL7u7", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PCQiEJsERrUyrVV2551MNs4eSDAhgQg5e4__4YRqUYuVZaBNPi9ekTHaVWgpox72qmUZk9bRq41WL7u7", - "type": "integer", - "value": 2647861143 - }, - { - "key": "%s%s%s__withdrawal__3PCRRYmirzTXmLZ9R2peoxYD4AugayNAizG__3KHFpr16VcnwNvs1E5ygi1pgEmdqQw17bwkeCDosQow4", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PCRRYmirzTXmLZ9R2peoxYD4AugayNAizG__3KHFpr16VcnwNvs1E5ygi1pgEmdqQw17bwkeCDosQow4", - "type": "integer", - "value": 683944419 - }, - { - "key": "%s%s%s__withdrawal__3PCRRYmirzTXmLZ9R2peoxYD4AugayNAizG__D9JX8EZ6gJiEei1FD5BvKihbfctDEWDvmvZ4KqAsR39A", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PCRRYmirzTXmLZ9R2peoxYD4AugayNAizG__D9JX8EZ6gJiEei1FD5BvKihbfctDEWDvmvZ4KqAsR39A", - "type": "integer", - "value": 616679837 - }, - { - "key": "%s%s%s__withdrawal__3PCoDJZ4R95qFdiAwdhjf9y2jtTiskJ9STo__9BfbSk8Eo9tA5rdgyJ6RYKDhyrGqZktvX5ngfbSF7oqs", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PCoDJZ4R95qFdiAwdhjf9y2jtTiskJ9STo__9BfbSk8Eo9tA5rdgyJ6RYKDhyrGqZktvX5ngfbSF7oqs", - "type": "integer", - "value": 100000000 - }, - { - "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__4S8g9z2F5PVRxmtgcbdqmg6izegibcatZnfqT2VniJFM", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__4S8g9z2F5PVRxmtgcbdqmg6izegibcatZnfqT2VniJFM", - "type": "integer", - "value": 135679809 - }, - { - "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__8Y66uDT4Rh68nCaU3WP2nsou6aMKDeBzJLWxqmjUsSbh", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__8Y66uDT4Rh68nCaU3WP2nsou6aMKDeBzJLWxqmjUsSbh", - "type": "integer", - "value": 100305841227 - }, - { - "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__Abybzx4zoTJfPBhN1m3wasqDBoAzhcMpQHz4fHPAgCEM", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__Abybzx4zoTJfPBhN1m3wasqDBoAzhcMpQHz4fHPAgCEM", - "type": "integer", - "value": 241963368500 - }, - { - "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__C27WZcwp3pxELD2Ejf3io8MyTKbbaDEi1vLMWoFVAUuc", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__C27WZcwp3pxELD2Ejf3io8MyTKbbaDEi1vLMWoFVAUuc", - "type": "integer", - "value": 5655047 - }, - { - "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__D4y1MHEJcjs1DAjGr1JfsYrn5SRP9f9uCr7RE8khJ6Z2", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__D4y1MHEJcjs1DAjGr1JfsYrn5SRP9f9uCr7RE8khJ6Z2", - "type": "integer", - "value": 317319860034 - }, - { - "key": "%s%s%s__withdrawal__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__GJhJWKZMRqbxq1J4eaz4WW2ua7qqh1FhDRuGxo7kRcH", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PCtjQVKfLxBCYMbu1k7zcbr7Fqt8ZdXPtm__GJhJWKZMRqbxq1J4eaz4WW2ua7qqh1FhDRuGxo7kRcH", - "type": "integer", - "value": 1413740 - }, - { - "key": "%s%s%s__withdrawal__3PCwtPsA4s2fyZrYs8A9QS2SgUr1Xe9qriV__AVeQzWSiEN7kGx23ycUg6rX4LdMZGDuLkY4rMrEsgHUr", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PCwtPsA4s2fyZrYs8A9QS2SgUr1Xe9qriV__AVeQzWSiEN7kGx23ycUg6rX4LdMZGDuLkY4rMrEsgHUr", - "type": "integer", - "value": 86870275 - }, - { - "key": "%s%s%s__withdrawal__3PCyijL9g2TTJ5uJogVW2sdgMjPoRH7xNZX__5stqqR15Ka98hKBE8gmV1SUkrFJc1RRRK9mPH7CHsV4m", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PCyijL9g2TTJ5uJogVW2sdgMjPoRH7xNZX__5stqqR15Ka98hKBE8gmV1SUkrFJc1RRRK9mPH7CHsV4m", - "type": "integer", - "value": 256014683952 - }, - { - "key": "%s%s%s__withdrawal__3PDMAiABRewTdMeNnGuVC3mWG7tQVuBWzYn__3cczdjKSoAY545hpRCJMZE6cBE9ZXgnMR7v6328rk7Fe", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PDMAiABRewTdMeNnGuVC3mWG7tQVuBWzYn__3cczdjKSoAY545hpRCJMZE6cBE9ZXgnMR7v6328rk7Fe", - "type": "integer", - "value": 4125527466 - }, - { - "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__4ZrPeEdaCcXzs1aZbZwHcFDR2zggEPwPgRodhbjNS2Va", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__4ZrPeEdaCcXzs1aZbZwHcFDR2zggEPwPgRodhbjNS2Va", - "type": "integer", - "value": 1980251476 - }, - { - "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__9Ze41pWqASikNqK8RFubn9BWqxYWSTBqyehfak2EFvNL", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__9Ze41pWqASikNqK8RFubn9BWqxYWSTBqyehfak2EFvNL", - "type": "integer", - "value": 1000000000 - }, - { - "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__C2YYEP7Ps8TiCrAgPZNJZJzYJLJSyi8CEExxVWRTcGkB", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__C2YYEP7Ps8TiCrAgPZNJZJzYJLJSyi8CEExxVWRTcGkB", - "type": "integer", - "value": 1582817293 - }, - { - "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__DJ5UzyYyqC8RQfWom26X8Qmn89Sb973Q9EmFpQkhvbsc", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__DJ5UzyYyqC8RQfWom26X8Qmn89Sb973Q9EmFpQkhvbsc", - "type": "integer", - "value": 289722509 - }, - { - "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__EH98Fiaw6ZyTFogRBBUupuNhcGP5vgrGbE5ZRPR4KKWH", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__EH98Fiaw6ZyTFogRBBUupuNhcGP5vgrGbE5ZRPR4KKWH", - "type": "integer", - "value": 6427446837 - }, - { - "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__EHvc7Q343pBwRgC9q7q3VoGuag2n4sHgkBzycoZY2cfj", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__EHvc7Q343pBwRgC9q7q3VoGuag2n4sHgkBzycoZY2cfj", - "type": "integer", - "value": 665445343 - }, - { - "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__Gza8TnPt4kKST5jCn3LLG3SdL8KDjTxmhHpfWVy7t6f7", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__Gza8TnPt4kKST5jCn3LLG3SdL8KDjTxmhHpfWVy7t6f7", - "type": "integer", - "value": 1500000000 - }, - { - "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__HFf32TnGQUXEhX2VxebBiiwT4ZTkEwhaksGKnZAsHMdc", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__HFf32TnGQUXEhX2VxebBiiwT4ZTkEwhaksGKnZAsHMdc", - "type": "integer", - "value": 1000000000 - }, - { - "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__Hj3d2nM1FYRCViPnRpPN76VWDgSoh2YueWjZ7soi1iys", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__Hj3d2nM1FYRCViPnRpPN76VWDgSoh2YueWjZ7soi1iys", - "type": "integer", - "value": 2107514993 - }, - { - "key": "%s%s%s__withdrawal__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__ak4a7Gba2S2WN27ddWkXJa8HzaKtiojiX8rqeVBDpto", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PDNAZBN8C3menYb9kn6Mej6Zwf1Gch6G2N__ak4a7Gba2S2WN27ddWkXJa8HzaKtiojiX8rqeVBDpto", - "type": "integer", - "value": 3000000000 - }, - { - "key": "%s%s%s__withdrawal__3PDRLD37a7qwABsxiKgfpJeqUt5CuSjetLL__HPMkfvfLYwy95G2uSyc1AQSdq6eC1bxBbbgzC3JDevSv", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PDRLD37a7qwABsxiKgfpJeqUt5CuSjetLL__HPMkfvfLYwy95G2uSyc1AQSdq6eC1bxBbbgzC3JDevSv", - "type": "integer", - "value": 8668503954 - }, - { - "key": "%s%s%s__withdrawal__3PDdkNJqhKGJNTHdqJbJrtKgQsoCgDHhMoZ__7j9fzhwDCR15DmzPCxLYRUBo8NyLDdQsF4PwKRSDNXfi", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PDdkNJqhKGJNTHdqJbJrtKgQsoCgDHhMoZ__7j9fzhwDCR15DmzPCxLYRUBo8NyLDdQsF4PwKRSDNXfi", - "type": "integer", - "value": 202048988016 + "value": 40727194436 } ] } \ No newline at end of file diff --git a/migrations/withdrawals/factory_dataTx_4.json b/migrations/withdrawals/factory_dataTx_4.json deleted file mode 100644 index fc35864..0000000 --- a/migrations/withdrawals/factory_dataTx_4.json +++ /dev/null @@ -1,458 +0,0 @@ -{ - "type": 12, - "version": 2, - "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", - "fee": 1500000, - "data": [ - { - "key": "%s%s%s__withdrawal__3PDyGuhrKsitcBJHJg1fviJQ4NoFFm3AR3j__13zpZkbR9BphAjNYLBrFhS8JjpFLcNcZq7jnDrDQeSSc", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PDyGuhrKsitcBJHJg1fviJQ4NoFFm3AR3j__13zpZkbR9BphAjNYLBrFhS8JjpFLcNcZq7jnDrDQeSSc", - "type": "integer", - "value": 5498421 - }, - { - "key": "%s%s%s__withdrawal__3PE6zfGg6yYimCXnNZzNZcCvuzRM719PGwm__4EkYEvEcN9VcNMybZyBvguS6VvezrFCCkWPFswEjMTyR", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PE6zfGg6yYimCXnNZzNZcCvuzRM719PGwm__4EkYEvEcN9VcNMybZyBvguS6VvezrFCCkWPFswEjMTyR", - "type": "integer", - "value": 134808490 - }, - { - "key": "%s%s%s__withdrawal__3PEM8TcwGMAmpSLA4tUkNRD1bsP7a62aAMS__2zMfat2vvXzUmirwoWhrLc1fCyh5irNtu98HbZsUzX3Q", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PEM8TcwGMAmpSLA4tUkNRD1bsP7a62aAMS__2zMfat2vvXzUmirwoWhrLc1fCyh5irNtu98HbZsUzX3Q", - "type": "integer", - "value": 3600000000 - }, - { - "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__2ZkpVAX7ysR429RuQZY7SFjepidyMwmLvvTfvFXRWCsQ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__2ZkpVAX7ysR429RuQZY7SFjepidyMwmLvvTfvFXRWCsQ", - "type": "integer", - "value": 119374108 - }, - { - "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__6ugq8QJRNCVa2vqR7mJqJyQmDFfz81CDQ91vQ4GmsAtE", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__6ugq8QJRNCVa2vqR7mJqJyQmDFfz81CDQ91vQ4GmsAtE", - "type": "integer", - "value": 101620720 - }, - { - "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__Bd6fU5Fg4P7gubju9n9y6ACMyypUprcteTFG4Kxq7nyJ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__Bd6fU5Fg4P7gubju9n9y6ACMyypUprcteTFG4Kxq7nyJ", - "type": "integer", - "value": 122677482 - }, - { - "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__BmJ9thNrMFKFwrp1W1tfcTWa4bsRUt2KpXgPgMuBL243", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__BmJ9thNrMFKFwrp1W1tfcTWa4bsRUt2KpXgPgMuBL243", - "type": "integer", - "value": 111226036 - }, - { - "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__E3ffqUgHVotYp3HcrrXpiDpSFPWrBpmqw8miNg2nbzBQ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__E3ffqUgHVotYp3HcrrXpiDpSFPWrBpmqw8miNg2nbzBQ", - "type": "integer", - "value": 111708069 - }, - { - "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__EUJtrBxYzJGP515pnusTccY3J4arifdvpN6NLJPfPBBG", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__EUJtrBxYzJGP515pnusTccY3J4arifdvpN6NLJPfPBBG", - "type": "integer", - "value": 314031850 - }, - { - "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__GAkPWdf1mPCBBAMHt5db9fKeTspeZzKRPAxyzhxTj1aY", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__GAkPWdf1mPCBBAMHt5db9fKeTspeZzKRPAxyzhxTj1aY", - "type": "integer", - "value": 105090202 - }, - { - "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__HC9jRsRT5JSdVLgQjPY3CWT11qTjEsWxFQ6aCnniK5Ze", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__HC9jRsRT5JSdVLgQjPY3CWT11qTjEsWxFQ6aCnniK5Ze", - "type": "integer", - "value": 451928553 - }, - { - "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__Hph1x3qXsst2ysXko9Mecq1qhB6WvaSrSb4VmBaAYQrk", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__Hph1x3qXsst2ysXko9Mecq1qhB6WvaSrSb4VmBaAYQrk", - "type": "integer", - "value": 265607223 - }, - { - "key": "%s%s%s__withdrawal__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__HsqjcoHQzUtSC6Nf3WsW4fD8G5HsurTs6mwGJxNS1AzC", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PENNY2n6JoXMPTTUQKSuds5uzPHt678FaD__HsqjcoHQzUtSC6Nf3WsW4fD8G5HsurTs6mwGJxNS1AzC", - "type": "integer", - "value": 81391103 - }, - { - "key": "%s%s%s__withdrawal__3PEbmcoRgzuf6W67XFqn6rm9PKU744H8PGG__AWZjFnDT9hJDPUwsvf3azouBZ1ipJymNMfTNJRtwGjpB", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PEbmcoRgzuf6W67XFqn6rm9PKU744H8PGG__AWZjFnDT9hJDPUwsvf3azouBZ1ipJymNMfTNJRtwGjpB", - "type": "integer", - "value": 58558547 - }, - { - "key": "%s%s%s__withdrawal__3PEbpUKHrLw4y5uLie6QEtsAS74TC5CRMLb__E5LBHGLTGgVc5hj8TviwwebHjjE9LCv6unw7QXkRJwao", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PEbpUKHrLw4y5uLie6QEtsAS74TC5CRMLb__E5LBHGLTGgVc5hj8TviwwebHjjE9LCv6unw7QXkRJwao", - "type": "integer", - "value": 2528864617 - }, - { - "key": "%s%s%s__withdrawal__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__CXhPZTuuWrv4SYAXnUSDGXgQd4Rjt28e32GVgn9SUg1n", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__CXhPZTuuWrv4SYAXnUSDGXgQd4Rjt28e32GVgn9SUg1n", - "type": "integer", - "value": 3743476274 - }, - { - "key": "%s%s%s__withdrawal__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__DkceM4tfugUJ9HVVYwtt9VyvKhTAm1YVYSivMZTViKAE", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__DkceM4tfugUJ9HVVYwtt9VyvKhTAm1YVYSivMZTViKAE", - "type": "integer", - "value": 41878551773 - }, - { - "key": "%s%s%s__withdrawal__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__GzDQVuTc8sG2g6CRGCzTNus9kWujuGf3kYViYG9z98k", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PEcnX7Fi1us3hF38Xd2Yxvkbc2bZX4Pnd1__GzDQVuTc8sG2g6CRGCzTNus9kWujuGf3kYViYG9z98k", - "type": "integer", - "value": 9366361994 - }, - { - "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__26cjFAYWH8Y24P5QN3JmCboRHwGCB1dNjWHZDsSTrUDr", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__26cjFAYWH8Y24P5QN3JmCboRHwGCB1dNjWHZDsSTrUDr", - "type": "integer", - "value": 532785065 - }, - { - "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__4jzbvZVYeGyAfv76RNmXUky1To35Wr3BfCKsksaxoRBU", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__4jzbvZVYeGyAfv76RNmXUky1To35Wr3BfCKsksaxoRBU", - "type": "integer", - "value": 675671991 - }, - { - "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__7RMh7WmnsDa1JcGTuCz6JWjzp9t1sGW4uSqNdEY6yyQo", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__7RMh7WmnsDa1JcGTuCz6JWjzp9t1sGW4uSqNdEY6yyQo", - "type": "integer", - "value": 584077704 - }, - { - "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__BQ5EWuQMfwM2NB5pEoKtGhaSPQCvbXv6h3fpLpdDmDd8", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__BQ5EWuQMfwM2NB5pEoKtGhaSPQCvbXv6h3fpLpdDmDd8", - "type": "integer", - "value": 1114711917 - }, - { - "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__Bt5sDSNhd6A7WkS4jYRZieJQiguYSme9edhrna54gKc8", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__Bt5sDSNhd6A7WkS4jYRZieJQiguYSme9edhrna54gKc8", - "type": "integer", - "value": 718465948 - }, - { - "key": "%s%s%s__withdrawal__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__Fpdr8dFVNc7DRGFgG7dc2CkdMSBXFM381YPP4fiWrxrj", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PEg1XKMBWAqC7KzB1TVK7oPAY9R1HNrjT5__Fpdr8dFVNc7DRGFgG7dc2CkdMSBXFM381YPP4fiWrxrj", - "type": "integer", - "value": 445181522 - }, - { - "key": "%s%s%s__withdrawal__3PF2RKwvJ4Cq45mEtSbG7trbU3yJ2ynZfVu__AejckCY2gxT1o7TnuQ7cFW2mqKQgqzFmKXgpzMG7GKc", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PF2RKwvJ4Cq45mEtSbG7trbU3yJ2ynZfVu__AejckCY2gxT1o7TnuQ7cFW2mqKQgqzFmKXgpzMG7GKc", - "type": "integer", - "value": 983457060 - }, - { - "key": "%s%s%s__withdrawal__3PF6HUACCxujjSbdxtUzPuwbQUjXQd4eqF2__DGm1La5bR2Mpo1skkcxXyWErDSKQRUZwLvk8NAWYWjZt", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PF6HUACCxujjSbdxtUzPuwbQUjXQd4eqF2__DGm1La5bR2Mpo1skkcxXyWErDSKQRUZwLvk8NAWYWjZt", - "type": "integer", - "value": 28602982006 - }, - { - "key": "%s%s%s__withdrawal__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__2pyjMwQx7T1LiWdrw4huDdYbGga3rcaK1n9MDba5yEnW", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__2pyjMwQx7T1LiWdrw4huDdYbGga3rcaK1n9MDba5yEnW", - "type": "integer", - "value": 37716698183 - }, - { - "key": "%s%s%s__withdrawal__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__EiGNbkvVnEHPUHmiZS3tk4VbupTZnLt6Cfot6i7zoToF", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__EiGNbkvVnEHPUHmiZS3tk4VbupTZnLt6Cfot6i7zoToF", - "type": "integer", - "value": 27500000000 - }, - { - "key": "%s%s%s__withdrawal__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__GJ6evDKg13d84WYbLiFHHpxnjdK17U3zVZmFjiEXWu7d", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PF9CZ6oCwSRX3c7VPRnNpVEuQYavosgWZL__GJ6evDKg13d84WYbLiFHHpxnjdK17U3zVZmFjiEXWu7d", - "type": "integer", - "value": 19425217483 - }, - { - "key": "%s%s%s__withdrawal__3PFDVSLtgPpPxiFHsUxxkv7NvyCuRSDHBc3__5znpEMbF6XVjjBoaFe7N59evehdu596qTpiDapCj8u8", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFDVSLtgPpPxiFHsUxxkv7NvyCuRSDHBc3__5znpEMbF6XVjjBoaFe7N59evehdu596qTpiDapCj8u8", - "type": "integer", - "value": 1329650000 - }, - { - "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__21pzAUwcSzei1tNRnDgbCK3DVF5SGycbgkhrCFrLN2rC", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__21pzAUwcSzei1tNRnDgbCK3DVF5SGycbgkhrCFrLN2rC", - "type": "integer", - "value": 853395178 - }, - { - "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__4WKe5SVgEKrCZexAT3iUkDqWWcTbaENsC5HwSK4ZTLhF", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__4WKe5SVgEKrCZexAT3iUkDqWWcTbaENsC5HwSK4ZTLhF", - "type": "integer", - "value": 948221917 - }, - { - "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__5pQH4TWKJvruXuwNpHDcYpQk34wHUNVUHTcaYyDmZzFG", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__5pQH4TWKJvruXuwNpHDcYpQk34wHUNVUHTcaYyDmZzFG", - "type": "integer", - "value": 836139448 - }, - { - "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__7fvT8A1jzLFM3h1EJjhAvS4KLa3eLkJMoGKdusXV6MsD", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__7fvT8A1jzLFM3h1EJjhAvS4KLa3eLkJMoGKdusXV6MsD", - "type": "integer", - "value": 2447716766 - }, - { - "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__7qfu5uNDVj8jYLVMQs3fuGDLDvTAWzVicgJeFDPLiZXy", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__7qfu5uNDVj8jYLVMQs3fuGDLDvTAWzVicgJeFDPLiZXy", - "type": "integer", - "value": 5040352822 - }, - { - "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__8VboUZtkyb1p3EYbGsQmRFYcnpCLHuTKSu24662jjHDw", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__8VboUZtkyb1p3EYbGsQmRFYcnpCLHuTKSu24662jjHDw", - "type": "integer", - "value": 5368497816 - }, - { - "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__8keoiqVV7CFH1uaXcDsEZhbQWpHb7ivG6LmU55zKDeTZ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__8keoiqVV7CFH1uaXcDsEZhbQWpHb7ivG6LmU55zKDeTZ", - "type": "integer", - "value": 877626342 - }, - { - "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__9Vib76kWbBpFEVx4ZQFAaspJpvc5Zsd7RgCU3zt5KUCb", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__9Vib76kWbBpFEVx4ZQFAaspJpvc5Zsd7RgCU3zt5KUCb", - "type": "integer", - "value": 952908378 - }, - { - "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__CAhRoF7KXd7cDnXk31yvUYekJPjYqE7HdnM7EB3iKehV", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__CAhRoF7KXd7cDnXk31yvUYekJPjYqE7HdnM7EB3iKehV", - "type": "integer", - "value": 818033805 - }, - { - "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__Cwi2Zp5H8ZkV1oDJ5jnKnWmRXJbfAjdyU6TV5JtontvP", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__Cwi2Zp5H8ZkV1oDJ5jnKnWmRXJbfAjdyU6TV5JtontvP", - "type": "integer", - "value": 6971318575 - }, - { - "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__EcnS5iicxCTMmmHsgvPnkjh85EkXidcLcvE5goSeRMkr", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__EcnS5iicxCTMmmHsgvPnkjh85EkXidcLcvE5goSeRMkr", - "type": "integer", - "value": 1041600762 - }, - { - "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__F8rSHY3yNMMYY8XkBh8QSC1HyVsNMAFnqXZgk5wDEAuw", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__F8rSHY3yNMMYY8XkBh8QSC1HyVsNMAFnqXZgk5wDEAuw", - "type": "integer", - "value": 895971095 - }, - { - "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__HsPbzuB3n9RR4xfeJustcUWhJ6jff9WTkPZL4jR1sDwM", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__HsPbzuB3n9RR4xfeJustcUWhJ6jff9WTkPZL4jR1sDwM", - "type": "integer", - "value": 969197240 - }, - { - "key": "%s%s%s__withdrawal__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__wxp9E9tEpd4mncxTFSkqbXY9A1TppF2Ke51JFpkVjnT", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFjC8ND8qq9BCALuBdcEdCSZKMnE4SYG5r__wxp9E9tEpd4mncxTFSkqbXY9A1TppF2Ke51JFpkVjnT", - "type": "integer", - "value": 991072029 - }, - { - "key": "%s%s%s__withdrawal__3PFvxLPUxCY9Et5uyfkYLE4SDZ5oJTCFWsG__86yvd4JHwPtS322ZEkV6B4HCs6L9jYDWukT47FjuYDJX", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFvxLPUxCY9Et5uyfkYLE4SDZ5oJTCFWsG__86yvd4JHwPtS322ZEkV6B4HCs6L9jYDWukT47FjuYDJX", - "type": "integer", - "value": 100000000 - }, - { - "key": "%s%s%s__withdrawal__3PFvxLPUxCY9Et5uyfkYLE4SDZ5oJTCFWsG__DEAxHFsgHCWipYK6NB5HndRrJqQrMHML37QEp8FkeC23", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFvxLPUxCY9Et5uyfkYLE4SDZ5oJTCFWsG__DEAxHFsgHCWipYK6NB5HndRrJqQrMHML37QEp8FkeC23", - "type": "integer", - "value": 47466546112 - }, - { - "key": "%s%s%s__withdrawal__3PFwm8UvcfcFUMLsxN2W3djtBgB1SPNBqRL__8ESBwLfuPzVx4ZACEKvMQ1RsMxLoYdqzWvyH4G462vuc", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFwm8UvcfcFUMLsxN2W3djtBgB1SPNBqRL__8ESBwLfuPzVx4ZACEKvMQ1RsMxLoYdqzWvyH4G462vuc", - "type": "integer", - "value": 27000000000 - }, - { - "key": "%s%s%s__withdrawal__3PFwyK4WEDb2qQ1wPFxG5rzyz7x2G1byMXz__Cm5btuYg9pPpVBz3ZuetVnmhWwU4jcycBVPKu81gJUL4", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PFwyK4WEDb2qQ1wPFxG5rzyz7x2G1byMXz__Cm5btuYg9pPpVBz3ZuetVnmhWwU4jcycBVPKu81gJUL4", - "type": "integer", - "value": 10000000 - }, - { - "key": "%s%s%s__withdrawal__3PGDywXYEdWACTs8rksuX9dxS3uGoWQpPyb__9z8Av1yEvy3PSAiqJ2xEG17RMf1zRYsYUQg5CMyrkRg7", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PGDywXYEdWACTs8rksuX9dxS3uGoWQpPyb__9z8Av1yEvy3PSAiqJ2xEG17RMf1zRYsYUQg5CMyrkRg7", - "type": "integer", - "value": 5000000000 - }, - { - "key": "%s%s%s__withdrawal__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__2YkRHtvmKRomGUWcLiSufyYkmaRKFjpDzm731PZ5Ca96", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__2YkRHtvmKRomGUWcLiSufyYkmaRKFjpDzm731PZ5Ca96", - "type": "integer", - "value": 5180026163 - } - ] -} \ No newline at end of file diff --git a/migrations/withdrawals/factory_dataTx_5.json b/migrations/withdrawals/factory_dataTx_5.json deleted file mode 100644 index 19377b4..0000000 --- a/migrations/withdrawals/factory_dataTx_5.json +++ /dev/null @@ -1,458 +0,0 @@ -{ - "type": 12, - "version": 2, - "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", - "fee": 1500000, - "data": [ - { - "key": "%s%s%s__withdrawal__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__2g3B8qVqV78FTTjmEZCofGQrA8e4PzayW21BhJ7aF4Se", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__2g3B8qVqV78FTTjmEZCofGQrA8e4PzayW21BhJ7aF4Se", - "type": "integer", - "value": 9106976438 - }, - { - "key": "%s%s%s__withdrawal__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__HaudTBcz2gJrEMgafNNDHJtZWWAKFigXukU6hR2a11gf", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PGcWmU4a6Rdm8QqZuV9D5YPHscwvQJWd1s__HaudTBcz2gJrEMgafNNDHJtZWWAKFigXukU6hR2a11gf", - "type": "integer", - "value": 10000000000 - }, - { - "key": "%s%s%s__withdrawal__3PGfXB5bEz7EkbtGMNUYop5aior5X6bUbvL__E3dhm3skoxPa8Pf1tt7Vai8ofmptVTDn7ngwzyEYXQcQ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PGfXB5bEz7EkbtGMNUYop5aior5X6bUbvL__E3dhm3skoxPa8Pf1tt7Vai8ofmptVTDn7ngwzyEYXQcQ", - "type": "integer", - "value": 23598235634 - }, - { - "key": "%s%s%s__withdrawal__3PH152STC5wrrSfAzzFerES8fSZaDXjvGHN__MeUeMVfgkCLzBH5fYfaExCxq6VXcniyNuxoq7fnEHhy", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PH152STC5wrrSfAzzFerES8fSZaDXjvGHN__MeUeMVfgkCLzBH5fYfaExCxq6VXcniyNuxoq7fnEHhy", - "type": "integer", - "value": 1885035978 - }, - { - "key": "%s%s%s__withdrawal__3PH3K5hyTYgM7Knt4vaXb9vbYZUABJQAFse__fmCRyZEiZyh74rFFvKs5piprrHrkvKhpxpZkEkfjCYC", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PH3K5hyTYgM7Knt4vaXb9vbYZUABJQAFse__fmCRyZEiZyh74rFFvKs5piprrHrkvKhpxpZkEkfjCYC", - "type": "integer", - "value": 154089136376 - }, - { - "key": "%s%s%s__withdrawal__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ__6y3o7fQZhi6kfyGPsbKpqK74tEGNBzf4Sb15LQfkJEaX", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ__6y3o7fQZhi6kfyGPsbKpqK74tEGNBzf4Sb15LQfkJEaX", - "type": "integer", - "value": 25461374 - }, - { - "key": "%s%s%s__withdrawal__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ__7sPzPdB2sCu7K2xK7est4NrBqCXjkKq3oiVE6j3Xspft", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ__7sPzPdB2sCu7K2xK7est4NrBqCXjkKq3oiVE6j3Xspft", - "type": "integer", - "value": 100011502579 - }, - { - "key": "%s%s%s__withdrawal__3PHvG6exQVNMLfNKY61F7EdPz5ByadQMstu__HfBo5aXhynH5G5N6QS9edxaPD5upjUFcM1Mr9Dewwwww", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PHvG6exQVNMLfNKY61F7EdPz5ByadQMstu__HfBo5aXhynH5G5N6QS9edxaPD5upjUFcM1Mr9Dewwwww", - "type": "integer", - "value": 124206166 - }, - { - "key": "%s%s%s__withdrawal__3PJ4dDgEyksWRdDBrZkCjFrURTcGCk7WN1c__CNJtg4SKiRtYHCUtFqcL6McFEwivbTM8w1QvnSNdHBMC", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PJ4dDgEyksWRdDBrZkCjFrURTcGCk7WN1c__CNJtg4SKiRtYHCUtFqcL6McFEwivbTM8w1QvnSNdHBMC", - "type": "integer", - "value": 13284185188 - }, - { - "key": "%s%s%s__withdrawal__3PJNxRGLG5wuuqcVjn7uviv4qaLfuq75xLH__4cdedswSNyVkYp3uYLk2wcTNgUtdsWh2qg5SPMNuTtrJ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PJNxRGLG5wuuqcVjn7uviv4qaLfuq75xLH__4cdedswSNyVkYp3uYLk2wcTNgUtdsWh2qg5SPMNuTtrJ", - "type": "integer", - "value": 24517194 - }, - { - "key": "%s%s%s__withdrawal__3PJNxRGLG5wuuqcVjn7uviv4qaLfuq75xLH__7V2PYFFNc6TE4qpLqKREEqucSTSVVbdHy8yFj7Gvtq1a", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PJNxRGLG5wuuqcVjn7uviv4qaLfuq75xLH__7V2PYFFNc6TE4qpLqKREEqucSTSVVbdHy8yFj7Gvtq1a", - "type": "integer", - "value": 29861169 - }, - { - "key": "%s%s%s__withdrawal__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__4knQr5WwBKxWKCQ1MpwzdPrnT255AXsS7jdDK8x6YT5T", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__4knQr5WwBKxWKCQ1MpwzdPrnT255AXsS7jdDK8x6YT5T", - "type": "integer", - "value": 6188870786 - }, - { - "key": "%s%s%s__withdrawal__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__6v6ePQu3PnXEMAigcgekbSCsvA4KiTGqnVtwByAwSZKM", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__6v6ePQu3PnXEMAigcgekbSCsvA4KiTGqnVtwByAwSZKM", - "type": "integer", - "value": 82025420216 - }, - { - "key": "%s%s%s__withdrawal__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__8NgLkdidMJmkTjrPxmEJ6i3MkKHBYxdHYRwCvfYhvAZq", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__8NgLkdidMJmkTjrPxmEJ6i3MkKHBYxdHYRwCvfYhvAZq", - "type": "integer", - "value": 38636714359 - }, - { - "key": "%s%s%s__withdrawal__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__CyVzTbazC9Vc2VU74icsethm8boSi2oSXMM6hnox5B7y", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PJUzkj7hbiSpnYh4SPgKDysn3ENqPdfYiw__CyVzTbazC9Vc2VU74icsethm8boSi2oSXMM6hnox5B7y", - "type": "integer", - "value": 5518279136 - }, - { - "key": "%s%s%s__withdrawal__3PJgDho14MN1ueX7D1kp2XJ3McggppfdQeT__38iTvkJJGpmAGwfk9rq5NsjUfhkbmhzvVwBWdFuz51z1", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PJgDho14MN1ueX7D1kp2XJ3McggppfdQeT__38iTvkJJGpmAGwfk9rq5NsjUfhkbmhzvVwBWdFuz51z1", - "type": "integer", - "value": 2279400001 - }, - { - "key": "%s%s%s__withdrawal__3PJgDho14MN1ueX7D1kp2XJ3McggppfdQeT__CKEtuKLzyAHPXYWVtkynKwoXRYFoKvYRN8PHE3ZuY1zj", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PJgDho14MN1ueX7D1kp2XJ3McggppfdQeT__CKEtuKLzyAHPXYWVtkynKwoXRYFoKvYRN8PHE3ZuY1zj", - "type": "integer", - "value": 189950000 - }, - { - "key": "%s%s%s__withdrawal__3PJjnz3z24vwDResuNo4Bgth1rYRre267qj__ChmdhRHtUmM7rRhtBPEgzHWQMUNfcdWhpCLr3ZsD2cuL", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PJjnz3z24vwDResuNo4Bgth1rYRre267qj__ChmdhRHtUmM7rRhtBPEgzHWQMUNfcdWhpCLr3ZsD2cuL", - "type": "integer", - "value": 504850444 - }, - { - "key": "%s%s%s__withdrawal__3PJjnz3z24vwDResuNo4Bgth1rYRre267qj__nmwa4843duu5nYoST9vouGKa8y4HwqAc12T3jHhPYB8", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PJjnz3z24vwDResuNo4Bgth1rYRre267qj__nmwa4843duu5nYoST9vouGKa8y4HwqAc12T3jHhPYB8", - "type": "integer", - "value": 1057278448 - }, - { - "key": "%s%s%s__withdrawal__3PJmNd7oXYHqDD92xYH4f6zxNxEV45togP3__4fUGeVxgWtHgqXLkEYhnKWGsNWciAfhieUSUnBfckkZZ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PJmNd7oXYHqDD92xYH4f6zxNxEV45togP3__4fUGeVxgWtHgqXLkEYhnKWGsNWciAfhieUSUnBfckkZZ", - "type": "integer", - "value": 1000000000 - }, - { - "key": "%s%s%s__withdrawal__3PJqcYDtN8RFLWoJCSosrxjTptgV9JFnQtp__DCffPCZfZ6crHWQrP8WH3a1cCQv6AzTNSpLxZCRV4iej", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PJqcYDtN8RFLWoJCSosrxjTptgV9JFnQtp__DCffPCZfZ6crHWQrP8WH3a1cCQv6AzTNSpLxZCRV4iej", - "type": "integer", - "value": 2212261405 - }, - { - "key": "%s%s%s__withdrawal__3PK8PvRf4Zdh893ntCTYSSGdSWaoKB4PUr3__9uK84Q6PvCgVdL2QXx4i5WRxXtVRv9eiwTk3Vbs9hxGM", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PK8PvRf4Zdh893ntCTYSSGdSWaoKB4PUr3__9uK84Q6PvCgVdL2QXx4i5WRxXtVRv9eiwTk3Vbs9hxGM", - "type": "integer", - "value": 124545050 - }, - { - "key": "%s%s%s__withdrawal__3PLBFxFwMgTNPptA8RnygTpPYazoWeSf3BS__5vcyoTeY7MtjDbD4YquDzdghqxbYBiznzQGtrTmLaYYf", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PLBFxFwMgTNPptA8RnygTpPYazoWeSf3BS__5vcyoTeY7MtjDbD4YquDzdghqxbYBiznzQGtrTmLaYYf", - "type": "integer", - "value": 5131396987 - }, - { - "key": "%s%s%s__withdrawal__3PLBFxFwMgTNPptA8RnygTpPYazoWeSf3BS__FmjNfBKycYTU9USTmyEVnToNanKdpBqzM4ShShvG8vi5", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PLBFxFwMgTNPptA8RnygTpPYazoWeSf3BS__FmjNfBKycYTU9USTmyEVnToNanKdpBqzM4ShShvG8vi5", - "type": "integer", - "value": 2214188025 - }, - { - "key": "%s%s%s__withdrawal__3PLTWcc26QWMkrmRvYqBkn6hTfwpmGRXTun__6HXFMAMEPXWXRToG6NTUYdYNCtjVhGjzgRRcLdqoJm8Q", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PLTWcc26QWMkrmRvYqBkn6hTfwpmGRXTun__6HXFMAMEPXWXRToG6NTUYdYNCtjVhGjzgRRcLdqoJm8Q", - "type": "integer", - "value": 11491448494 - }, - { - "key": "%s%s%s__withdrawal__3PLTWcc26QWMkrmRvYqBkn6hTfwpmGRXTun__8EiiCbEB81B4nGb275pD469tdUmmwqtHTeGGv9mWnUKi", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PLTWcc26QWMkrmRvYqBkn6hTfwpmGRXTun__8EiiCbEB81B4nGb275pD469tdUmmwqtHTeGGv9mWnUKi", - "type": "integer", - "value": 9005898638 - }, - { - "key": "%s%s%s__withdrawal__3PLfnQ8fCS2nyFdUh2Fmp8dJN7fs69jAhA5__8bN6rSyBPkX1QdKMEnNhkCRCWNZKVhnYJuxqMCn6G2iJ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PLfnQ8fCS2nyFdUh2Fmp8dJN7fs69jAhA5__8bN6rSyBPkX1QdKMEnNhkCRCWNZKVhnYJuxqMCn6G2iJ", - "type": "integer", - "value": 21219694522 - }, - { - "key": "%s%s%s__withdrawal__3PLfnQ8fCS2nyFdUh2Fmp8dJN7fs69jAhA5__GduqkYkLFpt7Y1BncCJMViiTH3ojdqbVKHzTuSEdZHFE", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PLfnQ8fCS2nyFdUh2Fmp8dJN7fs69jAhA5__GduqkYkLFpt7Y1BncCJMViiTH3ojdqbVKHzTuSEdZHFE", - "type": "integer", - "value": 100000000 - }, - { - "key": "%s%s%s__withdrawal__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__AkGRx1V9ojAux2getmZRRdUn23n89KKsmstVwcAGAuZb", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__AkGRx1V9ojAux2getmZRRdUn23n89KKsmstVwcAGAuZb", - "type": "integer", - "value": 1104595300 - }, - { - "key": "%s%s%s__withdrawal__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__H3wvP5J2x4iJbjNaJbJQjHm4MKAE4CLaVbVnG4HEgRHp", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__H3wvP5J2x4iJbjNaJbJQjHm4MKAE4CLaVbVnG4HEgRHp", - "type": "integer", - "value": 22024474326 - }, - { - "key": "%s%s%s__withdrawal__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__d6EnCTDD2hwDfmLiEq13yZoEo8n5JsjxhMybwdMuYNt", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PLnr2EwvtB2FYufD7tojV99RMEU9psAhYa__d6EnCTDD2hwDfmLiEq13yZoEo8n5JsjxhMybwdMuYNt", - "type": "integer", - "value": 10247942923 - }, - { - "key": "%s%s%s__withdrawal__3PMdqvU8tP5zBi4wEEFpaoNmvwXoqkkyYQS__HiAFnb8esSwj77Abn3LZjS5PiFnfi2QmPVyCwv2KJawb", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMdqvU8tP5zBi4wEEFpaoNmvwXoqkkyYQS__HiAFnb8esSwj77Abn3LZjS5PiFnfi2QmPVyCwv2KJawb", - "type": "integer", - "value": 10640600586 - }, - { - "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__5Qtp38JZfnJnoAmu6ADLGKcYwi9aDLmMVUQZYe7rhaai", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__5Qtp38JZfnJnoAmu6ADLGKcYwi9aDLmMVUQZYe7rhaai", - "type": "integer", - "value": 50100000000 - }, - { - "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__5idixthp7izdiGwG3ua26epBvYqAYV7zQqZwghDFZHKy", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__5idixthp7izdiGwG3ua26epBvYqAYV7zQqZwghDFZHKy", - "type": "integer", - "value": 10000000000 - }, - { - "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__6Bb76YoswJGwC61ztQLCU3hprSEXMtFC11sXYHvJG2dG", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__6Bb76YoswJGwC61ztQLCU3hprSEXMtFC11sXYHvJG2dG", - "type": "integer", - "value": 10000000000 - }, - { - "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__7fTFc6DDvN4Mn3G9JWEmyPpYqwzARbipDDMRyEsWcgkC", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__7fTFc6DDvN4Mn3G9JWEmyPpYqwzARbipDDMRyEsWcgkC", - "type": "integer", - "value": 1000000000 - }, - { - "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__A6vsyPJcHey5kUsFud5yesGGZGkQ4XXRQ63jf3XKdZHH", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__A6vsyPJcHey5kUsFud5yesGGZGkQ4XXRQ63jf3XKdZHH", - "type": "integer", - "value": 100000000 - }, - { - "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__BsQM5CxBt9EtKxK33UnvhHM9AKebhgz2XVLed3r8LTDS", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__BsQM5CxBt9EtKxK33UnvhHM9AKebhgz2XVLed3r8LTDS", - "type": "integer", - "value": 1000000000 - }, - { - "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__EpJ7YWwgQc6HSdPWJqHyaEfWbZx6Upi1Ym1NUPNnQQVR", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__EpJ7YWwgQc6HSdPWJqHyaEfWbZx6Upi1Ym1NUPNnQQVR", - "type": "integer", - "value": 300000000 - }, - { - "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__Er8WrcbpbuCUfTdXyu8268nTvosKADinLtmDASuPny2E", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__Er8WrcbpbuCUfTdXyu8268nTvosKADinLtmDASuPny2E", - "type": "integer", - "value": 57900000000 - }, - { - "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__FMCisHCSp1kHs4F4S2ERE8arTWM19X2NHK4tHKxkJwjf", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__FMCisHCSp1kHs4F4S2ERE8arTWM19X2NHK4tHKxkJwjf", - "type": "integer", - "value": 100000000 - }, - { - "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__HQG8EFhSgCewE6GTX6xQxZyxRBX9TPoZjqbaTXAEJgQ1", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__HQG8EFhSgCewE6GTX6xQxZyxRBX9TPoZjqbaTXAEJgQ1", - "type": "integer", - "value": 50000000000 - }, - { - "key": "%s%s%s__withdrawal__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__gTcfTtexav7mMB1vfLRZpZDCGYteh9PtUM2oAH5r9xD", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMfQJDkn7x2u475exdWiUZwa8ShQkfZ634__gTcfTtexav7mMB1vfLRZpZDCGYteh9PtUM2oAH5r9xD", - "type": "integer", - "value": 11318283824 - }, - { - "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__2HG1fz3cjhudSbQsopmybexvZFCDP2uUqEabjCW5qbVT", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__2HG1fz3cjhudSbQsopmybexvZFCDP2uUqEabjCW5qbVT", - "type": "integer", - "value": 1372000000 - }, - { - "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__5Jpai82zXxZwPRPWZ6A1h7xHdHJppMM59FAz9FCdUGr3", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__5Jpai82zXxZwPRPWZ6A1h7xHdHJppMM59FAz9FCdUGr3", - "type": "integer", - "value": 1707615511 - }, - { - "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__5cXxKQpeUzwsB7awHRaXd9WdAomHjn5BX3P4MJR8rHhK", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__5cXxKQpeUzwsB7awHRaXd9WdAomHjn5BX3P4MJR8rHhK", - "type": "integer", - "value": 1500000000 - }, - { - "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__6YRPZqJ4akuMkwJxc5H5RnPD9Fk7oZSJY5nxvacyibbF", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__6YRPZqJ4akuMkwJxc5H5RnPD9Fk7oZSJY5nxvacyibbF", - "type": "integer", - "value": 1662107678 - }, - { - "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__7mRDLhhRGKeTaDcn58zKmVACvZhUZXmL4rdi5JKX5QZF", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__7mRDLhhRGKeTaDcn58zKmVACvZhUZXmL4rdi5JKX5QZF", - "type": "integer", - "value": 985541647 - }, - { - "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__8YtcxL6tQ9oJ6f7tZ8Yz7HLdgKzEHMrQ4E7zgz5Nfgm7", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__8YtcxL6tQ9oJ6f7tZ8Yz7HLdgKzEHMrQ4E7zgz5Nfgm7", - "type": "integer", - "value": 1578268987 - }, - { - "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__9b6dXskPLQUsAJa4dSBusgczRFYBVHG5k3fC5jrhgCNd", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__9b6dXskPLQUsAJa4dSBusgczRFYBVHG5k3fC5jrhgCNd", - "type": "integer", - "value": 6612359551 - } - ] -} \ No newline at end of file diff --git a/migrations/withdrawals/factory_dataTx_6.json b/migrations/withdrawals/factory_dataTx_6.json deleted file mode 100644 index 9d9dbb0..0000000 --- a/migrations/withdrawals/factory_dataTx_6.json +++ /dev/null @@ -1,458 +0,0 @@ -{ - "type": 12, - "version": 2, - "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", - "fee": 1500000, - "data": [ - { - "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__C1bbtiktW93mhKw59EcjXVfjqd2yYa1vp2LjabfLCees", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__C1bbtiktW93mhKw59EcjXVfjqd2yYa1vp2LjabfLCees", - "type": "integer", - "value": 1082417979 - }, - { - "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__CC7fYgcqbNa77GbsBbsHY2cExwk9tyJdSpB3Wig1ohYQ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__CC7fYgcqbNa77GbsBbsHY2cExwk9tyJdSpB3Wig1ohYQ", - "type": "integer", - "value": 2250354116 - }, - { - "key": "%s%s%s__withdrawal__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__E31rNTSNJ5tRdtZV9DepzDkesqrKVwko3HcWtaDrSyFD", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMiVaaPEjeGXmVDiJcevnd6QwALDa8Rf7d__E31rNTSNJ5tRdtZV9DepzDkesqrKVwko3HcWtaDrSyFD", - "type": "integer", - "value": 800000000 - }, - { - "key": "%s%s%s__withdrawal__3PMn1g4oEd6q6Fx2zEzs8EBbsRHaCTUSwTd__4sSwNRdn2CX7pmEa4ee6oYY1R7XeUd8qAkMdtwGR5fcG", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMn1g4oEd6q6Fx2zEzs8EBbsRHaCTUSwTd__4sSwNRdn2CX7pmEa4ee6oYY1R7XeUd8qAkMdtwGR5fcG", - "type": "integer", - "value": 27770337947 - }, - { - "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__6f4izjAtjTyz49srEFkDYQKg3VZh85MrGaqD5853uRr9", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__6f4izjAtjTyz49srEFkDYQKg3VZh85MrGaqD5853uRr9", - "type": "integer", - "value": 150000000000 - }, - { - "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__9xbVkc3grQBeBCrxX1fd3wusWa14cZtDhkFGx5A8Q2qp", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__9xbVkc3grQBeBCrxX1fd3wusWa14cZtDhkFGx5A8Q2qp", - "type": "integer", - "value": 60120000000 - }, - { - "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__AHQJMxSgrCkevZNWzBCcik2CT971kuRiQGWQfq2Z2Et4", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__AHQJMxSgrCkevZNWzBCcik2CT971kuRiQGWQfq2Z2Et4", - "type": "integer", - "value": 102000000000 - }, - { - "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__AsmantJEUSf6FcovCUGMeLqY2Tju6Ph5gEfNy91QzWVK", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__AsmantJEUSf6FcovCUGMeLqY2Tju6Ph5gEfNy91QzWVK", - "type": "integer", - "value": 23000000000 - }, - { - "key": "%s%s%s__withdrawal__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__HMxC1o7rAnWDSXqeqWT9GnPWxTbF9GWXRGPRVHi3DgGy", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PMwqgdbcjwHjBxGaciq3bRc9E4sCfKpvcc__HMxC1o7rAnWDSXqeqWT9GnPWxTbF9GWXRGPRVHi3DgGy", - "type": "integer", - "value": 112000000000 - }, - { - "key": "%s%s%s__withdrawal__3PN2JRxJxjjZo1YJGyQrxdhoEbijc24BMY3__2tJMUah5hfeYuEoRrCFTKz18DSkqoguY3b9LweSfobKW", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PN2JRxJxjjZo1YJGyQrxdhoEbijc24BMY3__2tJMUah5hfeYuEoRrCFTKz18DSkqoguY3b9LweSfobKW", - "type": "integer", - "value": 100000000 - }, - { - "key": "%s%s%s__withdrawal__3PNE4mzP29TyWqFcYwnY81rbH3VwV6yhz3F__4qDYxDrqNVTJZzk3BxbT2uKNv1CsWRzBzTfUTNZyRc8Q", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PNE4mzP29TyWqFcYwnY81rbH3VwV6yhz3F__4qDYxDrqNVTJZzk3BxbT2uKNv1CsWRzBzTfUTNZyRc8Q", - "type": "integer", - "value": 7500000000 - }, - { - "key": "%s%s%s__withdrawal__3PNE4mzP29TyWqFcYwnY81rbH3VwV6yhz3F__DRHaW2EnaG2prxNZNQwLh98fr435A2JEZch1Z1TuBohu", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PNE4mzP29TyWqFcYwnY81rbH3VwV6yhz3F__DRHaW2EnaG2prxNZNQwLh98fr435A2JEZch1Z1TuBohu", - "type": "integer", - "value": 11219572500 - }, - { - "key": "%s%s%s__withdrawal__3PNMYZEJvMFpsAtuGszT4pmZkGuq6wkm2C3__7r4aeFjEN8xQ9FUTDxWVLGsh6Sjmcodppxu1QQ159nrH", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PNMYZEJvMFpsAtuGszT4pmZkGuq6wkm2C3__7r4aeFjEN8xQ9FUTDxWVLGsh6Sjmcodppxu1QQ159nrH", - "type": "integer", - "value": 2511376 - }, - { - "key": "%s%s%s__withdrawal__3PNMYZEJvMFpsAtuGszT4pmZkGuq6wkm2C3__9JZcvCkjkjwrrGXfUjdWS8cgVQs9dGnYK3fxtqwuKLao", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PNMYZEJvMFpsAtuGszT4pmZkGuq6wkm2C3__9JZcvCkjkjwrrGXfUjdWS8cgVQs9dGnYK3fxtqwuKLao", - "type": "integer", - "value": 1464210 - }, - { - "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__33iZJHJMKsjUk5H8YqhBZxSD2DKRiCmNrqHHe5E4qauN", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__33iZJHJMKsjUk5H8YqhBZxSD2DKRiCmNrqHHe5E4qauN", - "type": "integer", - "value": 264973207 - }, - { - "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__Akfx7XfCpbux94eJ8iK4WS5AxJQTbZU3ksfVWaYmaoWm", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__Akfx7XfCpbux94eJ8iK4WS5AxJQTbZU3ksfVWaYmaoWm", - "type": "integer", - "value": 352096109 - }, - { - "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__BtFtoTvrydPWPVNjCfuKSFfLG1qmosoxRX5Po93CUAd7", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__BtFtoTvrydPWPVNjCfuKSFfLG1qmosoxRX5Po93CUAd7", - "type": "integer", - "value": 397158954 - }, - { - "key": "%s%s%s__withdrawal__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__CEiaGJM3QMPCiwst4VodF61F1dx4CuPiJ5LiWuyb96Dn", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PNMoSkRdkNKwmBxgZTTuPFJcU4AuEy27tx__CEiaGJM3QMPCiwst4VodF61F1dx4CuPiJ5LiWuyb96Dn", - "type": "integer", - "value": 410380041 - }, - { - "key": "%s%s%s__withdrawal__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__9DBajjZRQJtjxea9JX7dgDqfVoq34Vyaw26oZDimKe9u", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__9DBajjZRQJtjxea9JX7dgDqfVoq34Vyaw26oZDimKe9u", - "type": "integer", - "value": 3553759632 - }, - { - "key": "%s%s%s__withdrawal__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__Gtx3Vyf9jagWnnpPyRkbSwtGEvcbsU9BqVbMNHcAXr9h", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__Gtx3Vyf9jagWnnpPyRkbSwtGEvcbsU9BqVbMNHcAXr9h", - "type": "integer", - "value": 23855625373 - }, - { - "key": "%s%s%s__withdrawal__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__n3PP9EvGbGYrS32aX9oDabRyRKj42KFmP5ufb7Y6ght", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PNNcMXZ4ao3T2v4HLVNaGX7jo4EFBux19i__n3PP9EvGbGYrS32aX9oDabRyRKj42KFmP5ufb7Y6ght", - "type": "integer", - "value": 4467412173 - }, - { - "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__2ebkb2cLaZXmyEisyTnBizosMSdm1hWU1TVePWZCJ5fF", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__2ebkb2cLaZXmyEisyTnBizosMSdm1hWU1TVePWZCJ5fF", - "type": "integer", - "value": 4720830954 - }, - { - "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__B6xmUHwecRUDQa2NTJDwL4WqmJCGaV5AaaAT3Pgt2RF6", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__B6xmUHwecRUDQa2NTJDwL4WqmJCGaV5AaaAT3Pgt2RF6", - "type": "integer", - "value": 3722048229 - }, - { - "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__BNUreyUB7YSPWWrMicjGzgt9wxzAkAco2MK7kGQBysYe", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__BNUreyUB7YSPWWrMicjGzgt9wxzAkAco2MK7kGQBysYe", - "type": "integer", - "value": 4949999601 - }, - { - "key": "%s%s%s__withdrawal__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__H1R65xBvcB1fLwRBvfXYFjpuMGkL35FFicaj1cqvK55g", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3__H1R65xBvcB1fLwRBvfXYFjpuMGkL35FFicaj1cqvK55g", - "type": "integer", - "value": 859876593 - }, - { - "key": "%s%s%s__withdrawal__3PPF9dNLQxrg6ARTkNnSuo6rAhuDo68YQ7r__EApLgiPoLyHpBiBqXnyjVi9LpnpTzbLdKBsiZSLMbqjf", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPF9dNLQxrg6ARTkNnSuo6rAhuDo68YQ7r__EApLgiPoLyHpBiBqXnyjVi9LpnpTzbLdKBsiZSLMbqjf", - "type": "integer", - "value": 4705014510 - }, - { - "key": "%s%s%s__withdrawal__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__9Diy1w6Mj2NHgdMB5PvbESzuki1DN8P86PFv9qeykAP7", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__9Diy1w6Mj2NHgdMB5PvbESzuki1DN8P86PFv9qeykAP7", - "type": "integer", - "value": 58973700 - }, - { - "key": "%s%s%s__withdrawal__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__F5arLeYN68LYMDJz7EXHyouk7WcAtUNtuMZs3ejZm3F4", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__F5arLeYN68LYMDJz7EXHyouk7WcAtUNtuMZs3ejZm3F4", - "type": "integer", - "value": 245284462 - }, - { - "key": "%s%s%s__withdrawal__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__HjHFEAS7pz8J8HLmgBS7rZqzXsu9Yti1JASsSrWRveWr", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPFTPFy9iyJMBPF7qUsQK7PWLUM8rk3zo9__HjHFEAS7pz8J8HLmgBS7rZqzXsu9Yti1JASsSrWRveWr", - "type": "integer", - "value": 126448836 - }, - { - "key": "%s%s%s__withdrawal__3PPPTqGUYHJUYqKkRCV3kAS44guun9iN7J8__Aquz2sGoefWKdV6ER1xJeepHR8yUvP4V1Fp4ixRzH25G", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPPTqGUYHJUYqKkRCV3kAS44guun9iN7J8__Aquz2sGoefWKdV6ER1xJeepHR8yUvP4V1Fp4ixRzH25G", - "type": "integer", - "value": 57668312500 - }, - { - "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__3vg8kegbVm2ejmrW7xaMUV6KdZ61cWmVs6KE1MRpdna2", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__3vg8kegbVm2ejmrW7xaMUV6KdZ61cWmVs6KE1MRpdna2", - "type": "integer", - "value": 88986460 - }, - { - "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5CFLiisJTWnVMBjc6UYKH9cA37Zg2fvtMDTj98Qo1s8b", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5CFLiisJTWnVMBjc6UYKH9cA37Zg2fvtMDTj98Qo1s8b", - "type": "integer", - "value": 47556289 - }, - { - "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5Jxs9Rb9wVXf7j3ZsZA4Mkumth9Uc7dkuUzvbZFxVRS", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5Jxs9Rb9wVXf7j3ZsZA4Mkumth9Uc7dkuUzvbZFxVRS", - "type": "integer", - "value": 43706593 - }, - { - "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5WRLsrAPUSqE3R62TB3UG3uAnEPJmiFhQK8LZ2qRfhKE", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__5WRLsrAPUSqE3R62TB3UG3uAnEPJmiFhQK8LZ2qRfhKE", - "type": "integer", - "value": 12064822 - }, - { - "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__6PgMYrWFnB1NyCcNLhYwoqbtwrcphZEDA3LAwyZfgdvo", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__6PgMYrWFnB1NyCcNLhYwoqbtwrcphZEDA3LAwyZfgdvo", - "type": "integer", - "value": 92521109 - }, - { - "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__98nS5WboAyAdDDW91Wvjaxtj179FEeaJx1C48DRJTtee", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__98nS5WboAyAdDDW91Wvjaxtj179FEeaJx1C48DRJTtee", - "type": "integer", - "value": 49647212 - }, - { - "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__9TUKDy1kHtZtevGbwmeUJomF89hg4jv5QuNLqbA3JPu5", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__9TUKDy1kHtZtevGbwmeUJomF89hg4jv5QuNLqbA3JPu5", - "type": "integer", - "value": 42112827 - }, - { - "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__9oPVAXjVUkuarf4Jy5JyHcsVJBAyVxyjdVMvU6neMx9m", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__9oPVAXjVUkuarf4Jy5JyHcsVJBAyVxyjdVMvU6neMx9m", - "type": "integer", - "value": 272651656 - }, - { - "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__CtP9dMwb1rJbPWgVbvNM8qJmh3NX7XhPiAbQFG9A5YW", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__CtP9dMwb1rJbPWgVbvNM8qJmh3NX7XhPiAbQFG9A5YW", - "type": "integer", - "value": 47485678 - }, - { - "key": "%s%s%s__withdrawal__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__GKvQpH5qyNFDwBjszeopK57za2RKPhtrV2YH6H5MqQDH", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPRBmaLdqpEA57qE3Nkh5E88wBx81tr3mD__GKvQpH5qyNFDwBjszeopK57za2RKPhtrV2YH6H5MqQDH", - "type": "integer", - "value": 51021072 - }, - { - "key": "%s%s%s__withdrawal__3PPVhnD2CG64dvGrKcXabDyg9zMyvwXQkA4__8Tfk3vV78xCGEYWwz8aUPsWdym4AgUPjMenKZh93VD8q", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPVhnD2CG64dvGrKcXabDyg9zMyvwXQkA4__8Tfk3vV78xCGEYWwz8aUPsWdym4AgUPjMenKZh93VD8q", - "type": "integer", - "value": 582547612 - }, - { - "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__6j9z4RYqcE5jLq9dNWVnirXXiJ8vdyUv2ReJBDjqD9xX", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__6j9z4RYqcE5jLq9dNWVnirXXiJ8vdyUv2ReJBDjqD9xX", - "type": "integer", - "value": 794114838 - }, - { - "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__8hddFNEJ3Qt4yHUKexAE7nddnRhT9gD5vRdGVvWcMzux", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__8hddFNEJ3Qt4yHUKexAE7nddnRhT9gD5vRdGVvWcMzux", - "type": "integer", - "value": 1127422959 - }, - { - "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__AQeSJmdEX9BM5R3LACFdiCHY8F7XgdoCspZJbGgtBPXm", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__AQeSJmdEX9BM5R3LACFdiCHY8F7XgdoCspZJbGgtBPXm", - "type": "integer", - "value": 1112701754 - }, - { - "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__C5i6YLpJwctyXrHYQ2wc1t1pv6mSVvJ93DH4yxnD73xQ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__C5i6YLpJwctyXrHYQ2wc1t1pv6mSVvJ93DH4yxnD73xQ", - "type": "integer", - "value": 290121282 - }, - { - "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__C6benzi7c8F638LWtTMxz8MbRTv8EC7G7TrzJNAkL7hN", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__C6benzi7c8F638LWtTMxz8MbRTv8EC7G7TrzJNAkL7hN", - "type": "integer", - "value": 3807508493 - }, - { - "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__EuaDZJsUjWcMyMUxKLrCAAZEFut7MDAb3hx7MK2WKXoo", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__EuaDZJsUjWcMyMUxKLrCAAZEFut7MDAb3hx7MK2WKXoo", - "type": "integer", - "value": 1388252316 - }, - { - "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__FYA2ByvLvACU5WwQvdU7wH1ViJmMGQUxgLF4KhU2Lg9E", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__FYA2ByvLvACU5WwQvdU7wH1ViJmMGQUxgLF4KhU2Lg9E", - "type": "integer", - "value": 395958686 - }, - { - "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__GetcvZmgP3jvFAwB7CvjBvPxArzxDCcRN14FhZKRh9Gq", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__GetcvZmgP3jvFAwB7CvjBvPxArzxDCcRN14FhZKRh9Gq", - "type": "integer", - "value": 436554860 - }, - { - "key": "%s%s%s__withdrawal__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__k7tCtzPDF7cV2ytLXqxgPfysczzJ2T2Moo4ViPKoALj", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPXpTagbQCSXYZ3Y5h6vuFPj6RxHbnapmE__k7tCtzPDF7cV2ytLXqxgPfysczzJ2T2Moo4ViPKoALj", - "type": "integer", - "value": 439418250 - } - ] -} \ No newline at end of file diff --git a/migrations/withdrawals/factory_dataTx_7.json b/migrations/withdrawals/factory_dataTx_7.json deleted file mode 100644 index 9a38df4..0000000 --- a/migrations/withdrawals/factory_dataTx_7.json +++ /dev/null @@ -1,305 +0,0 @@ -{ - "type": 12, - "version": 2, - "senderPublicKey": "7iwk3fSEypQw8aS1jGbgX19wsMviMu9tAENmGtHir9He", - "fee": 1200000, - "data": [ - { - "key": "%s%s%s__withdrawal__3PPaeRJpqdmWaNii5WvcvwmDteXZ8RkbTqA__2t3E4Y6TmgdCMn7UAjUQ97cGWgTRJdk6wEx3bkBBodJP", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPaeRJpqdmWaNii5WvcvwmDteXZ8RkbTqA__2t3E4Y6TmgdCMn7UAjUQ97cGWgTRJdk6wEx3bkBBodJP", - "type": "integer", - "value": 2852701640 - }, - { - "key": "%s%s%s__withdrawal__3PPoHiMrFPAKBsUKiBajVGzSrUGpz1hdJ7W__BhUKSTTLGA9G7R8PrYrLWtyHCXp5KcayxAJcpMUSGaV2", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPoHiMrFPAKBsUKiBajVGzSrUGpz1hdJ7W__BhUKSTTLGA9G7R8PrYrLWtyHCXp5KcayxAJcpMUSGaV2", - "type": "integer", - "value": 744927014 - }, - { - "key": "%s%s%s__withdrawal__3PPoHiMrFPAKBsUKiBajVGzSrUGpz1hdJ7W__CCEu4evWfwPyqL84DWiUbEGvVMiny2HU6daC99Ypinjt", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPoHiMrFPAKBsUKiBajVGzSrUGpz1hdJ7W__CCEu4evWfwPyqL84DWiUbEGvVMiny2HU6daC99Ypinjt", - "type": "integer", - "value": 517848375 - }, - { - "key": "%s%s%s__withdrawal__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__52LeJ3r4JSVCMFRDsfnMvMsJejtYbB1iq3kRfLhyZGuJ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__52LeJ3r4JSVCMFRDsfnMvMsJejtYbB1iq3kRfLhyZGuJ", - "type": "integer", - "value": 50000000 - }, - { - "key": "%s%s%s__withdrawal__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__8VcrH4zxgYKX8M9V3DHrDZwrRdeTfKaVE5z4pR2gmUGK", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__8VcrH4zxgYKX8M9V3DHrDZwrRdeTfKaVE5z4pR2gmUGK", - "type": "integer", - "value": 300000000 - }, - { - "key": "%s%s%s__withdrawal__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__CKXSfCRMUy4ecdSCz7QNAcKUcGGBetKt2vQqDG7H2f8M", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PPwwvLTHe5AvcTXk54Wqr4wBm6HQCyDDKr__CKXSfCRMUy4ecdSCz7QNAcKUcGGBetKt2vQqDG7H2f8M", - "type": "integer", - "value": 650000000 - }, - { - "key": "%s%s%s__withdrawal__3PQBxD7LjHw9vag6XohS9QFs9EyFDBUWzA6__6oN7aQFiYSUVzWCjYHWGeVzYfVpCqBwiSqcZc1WNdZND", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQBxD7LjHw9vag6XohS9QFs9EyFDBUWzA6__6oN7aQFiYSUVzWCjYHWGeVzYfVpCqBwiSqcZc1WNdZND", - "type": "integer", - "value": 6488412500 - }, - { - "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__AJtPpEpBvuDwBKxMDdxLLFxF43Wvso4iLRjDxrevhnF7", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__AJtPpEpBvuDwBKxMDdxLLFxF43Wvso4iLRjDxrevhnF7", - "type": "integer", - "value": 1990048072 - }, - { - "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__ApDtWNtZSFTZAZ5YhW1BWgtBJMaM35vseAZKno1kvqFb", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__ApDtWNtZSFTZAZ5YhW1BWgtBJMaM35vseAZKno1kvqFb", - "type": "integer", - "value": 224432354 - }, - { - "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__BvPELHTyNfM9vFD7LZtNZ8Z5T9sghkRgPk78ciiLYekp", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__BvPELHTyNfM9vFD7LZtNZ8Z5T9sghkRgPk78ciiLYekp", - "type": "integer", - "value": 1537932461 - }, - { - "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__CNdg1ue8v4KRoAotXfrvNMq6WWb4X1kwXPnWZgRAqLE5", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__CNdg1ue8v4KRoAotXfrvNMq6WWb4X1kwXPnWZgRAqLE5", - "type": "integer", - "value": 3828673277 - }, - { - "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__QGmkfh3gT7U2oUhyavSGq6x4i3qMz1oJcTnui1Wxodw", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__QGmkfh3gT7U2oUhyavSGq6x4i3qMz1oJcTnui1Wxodw", - "type": "integer", - "value": 5284407404 - }, - { - "key": "%s%s%s__withdrawal__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__bD6dA8xv5Yh4vvY7MVEABy9X2YhKhM6xAZsntiEqj93", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQD8TWJvnPNoZkihXVDRCUD56vhUtCwzJb__bD6dA8xv5Yh4vvY7MVEABy9X2YhKhM6xAZsntiEqj93", - "type": "integer", - "value": 3554156418 - }, - { - "key": "%s%s%s__withdrawal__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__8C6PFFdPkyKPhcX6CmmdjdruiRjMfEzsGzFDq6GMLUkn", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__8C6PFFdPkyKPhcX6CmmdjdruiRjMfEzsGzFDq6GMLUkn", - "type": "integer", - "value": 50024613538 - }, - { - "key": "%s%s%s__withdrawal__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__HZY84W5PdvUumEJwK79FJVvFs8EeZZmRxW2oTRy27xWJ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__HZY84W5PdvUumEJwK79FJVvFs8EeZZmRxW2oTRy27xWJ", - "type": "integer", - "value": 75840474800 - }, - { - "key": "%s%s%s__withdrawal__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__HjnPhhgA6ZnaAo7CKM7VictjBpaE5LberDY7n9EbYddY", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__HjnPhhgA6ZnaAo7CKM7VictjBpaE5LberDY7n9EbYddY", - "type": "integer", - "value": 50888078135 - }, - { - "key": "%s%s%s__withdrawal__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__vkx3YymHjBha2FWAKC5PEq8Nq8VcwYyrAfk5khk2dib", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQGtJCM4G8Gf51ebZNk4cWMM288CmR8FaS__vkx3YymHjBha2FWAKC5PEq8Nq8VcwYyrAfk5khk2dib", - "type": "integer", - "value": 84664215665 - }, - { - "key": "%s%s%s__withdrawal__3PQhGvLgHdUt4GviS8wX5ZwqAZQPv5mnUoi__HGBV4ro9G3WTUnUynnBWFhrW55NBSU9NgU9ZrHHLLMMX", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQhGvLgHdUt4GviS8wX5ZwqAZQPv5mnUoi__HGBV4ro9G3WTUnUynnBWFhrW55NBSU9NgU9ZrHHLLMMX", - "type": "integer", - "value": 40727194436 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__4Hetgye6J6G2CzJs6QvJyMgrS7LLA8TU6sW1cP36hv6E", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__4Hetgye6J6G2CzJs6QvJyMgrS7LLA8TU6sW1cP36hv6E", - "type": "integer", - "value": 416625275 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__4vSn8c4FPJRmSoUYxfWugH6AgcGqSTWpu8xhegVfuVEK", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__4vSn8c4FPJRmSoUYxfWugH6AgcGqSTWpu8xhegVfuVEK", - "type": "integer", - "value": 302486188 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__62Pk9JSsMn7zra3iR9f2927bC9NTqoiQ6aaYu1V7kdBR", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__62Pk9JSsMn7zra3iR9f2927bC9NTqoiQ6aaYu1V7kdBR", - "type": "integer", - "value": 274219464 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__8Q78hTVQCYi3sS86tPbDLiW2fpVY8BtM6TAcaJkL3ENH", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__8Q78hTVQCYi3sS86tPbDLiW2fpVY8BtM6TAcaJkL3ENH", - "type": "integer", - "value": 200567172 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__9d6f2HV6z9xxm9zY1LBBHALj842T9qcp8m67nVyYrfb5", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__9d6f2HV6z9xxm9zY1LBBHALj842T9qcp8m67nVyYrfb5", - "type": "integer", - "value": 193750156 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__9zf7KkzERyG7wFdRJoNcoFM6AQSgNFdBRVHVJPBLzYH1", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__9zf7KkzERyG7wFdRJoNcoFM6AQSgNFdBRVHVJPBLzYH1", - "type": "integer", - "value": 221712181 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__ADiuX8e2rUukzJ2LJsSyJ8ZXyiqyWHX1A8prHHMJg1Tg", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__ADiuX8e2rUukzJ2LJsSyJ8ZXyiqyWHX1A8prHHMJg1Tg", - "type": "integer", - "value": 225212936 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__AXzYfacF89xP3V1HPJpHtFyWr6NSUSghY5uf4k8i4t2E", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__AXzYfacF89xP3V1HPJpHtFyWr6NSUSghY5uf4k8i4t2E", - "type": "integer", - "value": 239849064 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__DAWXUb2yCRC7skYyB27Bfh9Beg2hJKZWfGu6D2QZjRGC", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__DAWXUb2yCRC7skYyB27Bfh9Beg2hJKZWfGu6D2QZjRGC", - "type": "integer", - "value": 234455985 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__DBnGAbNokVUFEB9ZbeSHT64iMDWEQLQZj2fHkj42SPAi", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__DBnGAbNokVUFEB9ZbeSHT64iMDWEQLQZj2fHkj42SPAi", - "type": "integer", - "value": 243643334 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__ED4xMGmBmtkfrxKubEEmCBDNVDETS3MM7Lg7c16WiZFD", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__ED4xMGmBmtkfrxKubEEmCBDNVDETS3MM7Lg7c16WiZFD", - "type": "integer", - "value": 236765963 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__Ff5SisM2KUuXKEbD1Cw5gxD3z5SHotfYzCPCjbkvYhbX", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__Ff5SisM2KUuXKEbD1Cw5gxD3z5SHotfYzCPCjbkvYhbX", - "type": "integer", - "value": 267838936 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__GCLdGUJH1mBpAUG8ezQnU4NPf6EwMcUPi1XTvEeTHZhR", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__GCLdGUJH1mBpAUG8ezQnU4NPf6EwMcUPi1XTvEeTHZhR", - "type": "integer", - "value": 241810714 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__GLKSzAta5nxi3pcQ1znBbDK2ucK4XtdqiFmwnzQ3cmQ", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__GLKSzAta5nxi3pcQ1znBbDK2ucK4XtdqiFmwnzQ3cmQ", - "type": "integer", - "value": 232329835 - }, - { - "key": "%s%s%s__withdrawal__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__rf3YcR8sYXFLR4xH7KexyyLFrsrUEWGxZamGtWiVJwG", - "value": null - }, - { - "key": "%s%s%s__withdrawalHistory__3PQuTrNwbkHpwgBpevKuEC7sYxXqn5Tc6gf__rf3YcR8sYXFLR4xH7KexyyLFrsrUEWGxZamGtWiVJwG", - "type": "integer", - "value": 233290680 - } - ] -} \ No newline at end of file From 5252eeae37483ad5e50429e684f96c3e6374204e Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Mon, 11 Dec 2023 15:10:21 +0300 Subject: [PATCH 142/143] Migration Added l2mp proxy address --- migrations/2023_12_06_factory_data_tx.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migrations/2023_12_06_factory_data_tx.json b/migrations/2023_12_06_factory_data_tx.json index 8493e86..357cde9 100644 --- a/migrations/2023_12_06_factory_data_tx.json +++ b/migrations/2023_12_06_factory_data_tx.json @@ -9,7 +9,7 @@ { "key": "%s__l2mpProxy", "type": "string", - "value": "" + "value": "3PHZKnwMi7dVAUdJvxMSN885zstyA3yf49t" } ], "proofs": [], From fb800b78a4a95df8b54998f217dbe1eb2299ae04 Mon Sep 17 00:00:00 2001 From: Grigory Ivanov Date: Mon, 11 Dec 2023 15:31:35 +0300 Subject: [PATCH 143/143] Migration Update calculator and reward --- migrations/2023_12_06_factory_data_tx.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/migrations/2023_12_06_factory_data_tx.json b/migrations/2023_12_06_factory_data_tx.json index 357cde9..32ff6cc 100644 --- a/migrations/2023_12_06_factory_data_tx.json +++ b/migrations/2023_12_06_factory_data_tx.json @@ -10,6 +10,21 @@ "key": "%s__l2mpProxy", "type": "string", "value": "3PHZKnwMi7dVAUdJvxMSN885zstyA3yf49t" + }, + { + "key": "%s%d__periodReward__1", + "type": "string", + "value": "" + }, + { + "key": "%s%d__periodRewardAmount__1", + "type": "string", + "value": "" + }, + { + "key": "%s__calculator", + "type": "string", + "value": "3P7K135m6R2Yyx9q2kW4asTcDFKNzaVJRvp" } ], "proofs": [],