diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6aae4a5ae..30432e52f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,7 +37,7 @@ jobs: egress-policy: audit - name: Checkout Code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: submodules: true @@ -115,7 +115,7 @@ jobs: egress-policy: audit - name: Checkout Code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: submodules: recursive diff --git a/.github/workflows/common_js.yml b/.github/workflows/common_js.yml index 52f63a01a..90e515dd3 100644 --- a/.github/workflows/common_js.yml +++ b/.github/workflows/common_js.yml @@ -33,7 +33,7 @@ jobs: egress-policy: audit - name: Checkout Code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: submodules: true diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index e9db17c4e..5a1db2c2f 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -11,6 +11,7 @@ defaults: permissions: pages: write contents: read + id-token: write jobs: build-and-deploy-docs: @@ -23,7 +24,7 @@ jobs: egress-policy: audit - name: Checkout Code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: submodules: recursive diff --git a/.github/workflows/publish_release.yaml b/.github/workflows/publish_release.yaml index 08a2a7643..d81d8bd29 100644 --- a/.github/workflows/publish_release.yaml +++ b/.github/workflows/publish_release.yaml @@ -55,7 +55,7 @@ jobs: egress-policy: audit - name: Checkout Code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ github.event.inputs.tag || '' }} fetch-depth: 0 @@ -235,7 +235,7 @@ jobs: egress-policy: audit - name: Checkout Code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ github.event.inputs.tag || '' }} @@ -271,7 +271,7 @@ jobs: egress-policy: audit - name: Checkout Code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ github.event.inputs.tag || '' }} diff --git a/.github/workflows/react_native.yml b/.github/workflows/react_native.yml index 001bbf1d9..5439b537f 100644 --- a/.github/workflows/react_native.yml +++ b/.github/workflows/react_native.yml @@ -31,7 +31,7 @@ jobs: egress-policy: audit - name: Checkout Code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Setup Java uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4.2.1 @@ -92,7 +92,7 @@ jobs: egress-policy: audit - name: Checkout Code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Setup Java uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4.2.1 diff --git a/.github/workflows/renovate.yml b/.github/workflows/renovate.yml index ca5c5bbe4..f68b7d530 100644 --- a/.github/workflows/renovate.yml +++ b/.github/workflows/renovate.yml @@ -23,7 +23,7 @@ jobs: egress-policy: audit - name: Checkout Code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: submodules: recursive diff --git a/CHANGELOG.md b/CHANGELOG.md index 9788f40bf..adb81b8cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## v2.49.2 + +## What's Changed + +* fix: update taskfile status check for submodules task by @isavov in https://github.com/hashgraph/hedera-sdk-js/pull/2435 +* chore: fix token permissions for deploy to github pages by @isavov in https://github.com/hashgraph/hedera-sdk-js/pull/2418 +* fix: reconnect to working node by @0xivanov in https://github.com/hashgraph/hedera-sdk-js/pull/2417 +* release: proto v2.15.0-beta.3 by @svetoslav-nikol0v in https://github.com/hashgraph/hedera-sdk-js/pull/2415 +* update: add node id to the precheck error by @svetoslav-nikol0v in https://github.com/hashgraph/hedera-sdk-js/pull/2414 +* feat: Implement TokenRejectTransaction by @ivaylonikolov7 in https://github.com/hashgraph/hedera-sdk-js/pull/2411 +* update: handle PLATFORM_NOT_ACTIVE error gracefully by @svetoslav-nikol0v in https://github.com/hashgraph/hedera-sdk-js/pull/2401 +* feat: pull protobuf changes from latest tag by @isavov in https://github.com/hashgraph/hedera-sdk-js/pull/2435 +* chore: fix token permissions for deploy to github pages by @isavov in https://github.com/hashgraph/hedera-sdk-js/pull/2389 +* update: release all skipped tests by @svetoslav-nikol0v in https://github.com/hashgraph/hedera-sdk-js/pull/2395 +* test: add maxAutomaticTokenAssociations tests by @ivaylonikolov7 in https://github.com/hashgraph/hedera-sdk-js/pull/2390 + ## v2.48.1 ## What's Changed diff --git a/examples/react-native-example/yarn.lock b/examples/react-native-example/yarn.lock index b4aa8926a..f1281c5a8 100644 --- a/examples/react-native-example/yarn.lock +++ b/examples/react-native-example/yarn.lock @@ -3779,9 +3779,9 @@ fast-glob@^3.2.5, fast-glob@^3.2.9: micromatch "^4.0.4" fast-loops@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.3.tgz" - integrity sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g== + version "1.1.4" + resolved "https://registry.yarnpkg.com/fast-loops/-/fast-loops-1.1.4.tgz#61bc77d518c0af5073a638c6d9d5c7683f069ce2" + integrity sha512-8dbd3XWoKCTms18ize6JmQF1SFnnfj5s0B7rRry22EofgMu7B6LKHVh+XfFqFGsqnbH54xgeO83PzpKI+ODhlg== fast-redact@^3.1.1: version "3.3.0" diff --git a/examples/token-reject.js b/examples/token-reject.js new file mode 100644 index 000000000..cad9db09c --- /dev/null +++ b/examples/token-reject.js @@ -0,0 +1,241 @@ +import { + AccountCreateTransaction, + PrivateKey, + TokenCreateTransaction, + TransferTransaction, + AccountId, + Client, + TokenType, + TokenMintTransaction, + TokenRejectTransaction, + TokenRejectFlow, + NftId, + AccountBalanceQuery, + TokenSupplyType, +} from "@hashgraph/sdk"; +import dotenv from "dotenv"; + +dotenv.config(); + +async function main() { + if ( + process.env.OPERATOR_ID == null || + process.env.OPERATOR_KEY == null || + process.env.HEDERA_NETWORK == null + ) { + throw new Error( + "Environment variables OPERATOR_ID, HEDERA_NETWORK, and OPERATOR_KEY are required.", + ); + } + const CID = [ + "QmNPCiNA3Dsu3K5FxDPMG5Q3fZRwVTg14EXA92uqEeSRXn", + "QmZ4dgAgt8owvnULxnKxNe8YqpavtVCXmc1Lt2XajFpJs9", + "QmPzY5GxevjyfMUF5vEAjtyRoigzWp47MiKAtLBduLMC1T", + ]; + const operatorId = AccountId.fromString(process.env.OPERATOR_ID); + const operatorKey = PrivateKey.fromStringED25519(process.env.OPERATOR_KEY); + const network = process.env.HEDERA_NETWORK; + const client = Client.forName(network).setOperator(operatorId, operatorKey); + + // create a treasury account + const treasuryPrivateKey = PrivateKey.generateED25519(); + const treasuryAccountId = ( + await ( + await new AccountCreateTransaction() + .setKey(treasuryPrivateKey) + .setMaxAutomaticTokenAssociations(100) + .execute(client) + ).getReceipt(client) + ).accountId; + + // create a receiver account with unlimited max auto associations + const receiverPrivateKey = PrivateKey.generateED25519(); + const receiverAccountId = ( + await ( + await new AccountCreateTransaction() + .setKey(receiverPrivateKey) + .setMaxAutomaticTokenAssociations(-1) + .execute(client) + ).getReceipt(client) + ).accountId; + + // create a nft collection + const nftCreationTx = await ( + await new TokenCreateTransaction() + .setTokenType(TokenType.NonFungibleUnique) + .setTokenName("Example Fungible Token") + .setTokenSymbol("EFT") + .setMaxSupply(CID.length) + .setSupplyType(TokenSupplyType.Finite) + .setSupplyKey(operatorKey) + .setAdminKey(operatorKey) + .setTreasuryAccountId(treasuryAccountId) + .freezeWith(client) + .sign(treasuryPrivateKey) + ).execute(client); + + const nftId = (await nftCreationTx.getReceipt(client)).tokenId; + console.log("NFT ID: ", nftId.toString()); + + // create a fungible token + const ftCreationTx = await ( + await new TokenCreateTransaction() + .setTokenName("Example Fungible Token") + .setTokenSymbol("EFT") + .setInitialSupply(100000000) + .setSupplyKey(operatorKey) + .setAdminKey(operatorKey) + .setTreasuryAccountId(treasuryAccountId) + .freezeWith(client) + .sign(treasuryPrivateKey) + ).execute(client); + + const ftId = (await ftCreationTx.getReceipt(client)).tokenId; + console.log("FT ID: ", ftId.toString()); + + // mint 3 NFTs to treasury + const nftSerialIds = []; + for (let i = 0; i < CID.length; i++) { + const { serials } = await ( + await new TokenMintTransaction() + .setTokenId(nftId) + .addMetadata(Buffer.from(CID[i])) + .execute(client) + ).getReceipt(client); + const [serial] = serials; + nftSerialIds.push(new NftId(nftId, serial)); + } + + // transfer nfts to receiver + await ( + await ( + await new TransferTransaction() + .addNftTransfer( + nftSerialIds[0], + treasuryAccountId, + receiverAccountId, + ) + .addNftTransfer( + nftSerialIds[1], + treasuryAccountId, + receiverAccountId, + ) + .addNftTransfer( + nftSerialIds[2], + treasuryAccountId, + receiverAccountId, + ) + .freezeWith(client) + .sign(treasuryPrivateKey) + ).execute(client) + ).getReceipt(client); + + // transfer fungible tokens to receiver + await ( + await ( + await new TransferTransaction() + .addTokenTransfer(ftId, treasuryAccountId, -1) + .addTokenTransfer(ftId, receiverAccountId, 1) + .freezeWith(client) + .sign(treasuryPrivateKey) + ).execute(client) + ).getReceipt(client); + + console.log("======================="); + console.log("Before Token Reject"); + console.log("======================="); + const receiverFTBalanceBefore = ( + await new AccountBalanceQuery() + .setAccountId(receiverAccountId) + .execute(client) + ).tokens.get(ftId); + const treasuryFTBalanceBefore = ( + await new AccountBalanceQuery() + .setAccountId(treasuryAccountId) + .execute(client) + ).tokens.get(ftId); + const receiverNFTBalanceBefore = ( + await new AccountBalanceQuery() + .setAccountId(receiverAccountId) + .execute(client) + ).tokens.get(nftId); + const treasuryNFTBalanceBefore = ( + await new AccountBalanceQuery() + .setAccountId(treasuryAccountId) + .execute(client) + ).tokens.get(nftId); + console.log("Receiver FT balance: ", receiverFTBalanceBefore.toInt()); + console.log("Treasury FT balance: ", treasuryFTBalanceBefore.toInt()); + console.log( + "Receiver NFT balance: ", + receiverNFTBalanceBefore ? receiverNFTBalanceBefore.toInt() : 0, + ); + console.log("Treasury NFT balance: ", treasuryNFTBalanceBefore.toInt()); + + // reject fungible tokens back to treasury + const tokenRejectResponse = await ( + await ( + await new TokenRejectTransaction() + .setOwnerId(receiverAccountId) + .addTokenId(ftId) + .freezeWith(client) + .sign(receiverPrivateKey) + ).execute(client) + ).getReceipt(client); + + // reject NFTs back to treasury + const rejectFlowResponse = await ( + await ( + new TokenRejectFlow() + .setOwnerId(receiverAccountId) + .setNftIds(nftSerialIds) + .freezeWith(client) + .sign(receiverPrivateKey) + ).execute(client) + ).getReceipt(client); + + const tokenRejectStatus = tokenRejectResponse.status.toString(); + const tokenRejectFlowStatus = rejectFlowResponse.status.toString(); + + console.log("======================="); + console.log("After Token Reject Transaction and flow"); + console.log("======================="); + + const receiverFTBalanceAfter = ( + await new AccountBalanceQuery() + .setAccountId(receiverAccountId) + .execute(client) + ).tokens.get(ftId); + + const treasuryFTBalanceAfter = ( + await new AccountBalanceQuery() + .setAccountId(treasuryAccountId) + .execute(client) + ).tokens.get(ftId); + + const receiverNFTBalanceAfter = ( + await new AccountBalanceQuery() + .setAccountId(receiverAccountId) + .execute(client) + ).tokens.get(nftId); + + const treasuryNFTBalanceAfter = ( + await new AccountBalanceQuery() + .setAccountId(treasuryAccountId) + .execute(client) + ).tokens.get(nftId); + + console.log("TokenReject response:", tokenRejectStatus); + console.log("TokenRejectFlow response:", tokenRejectFlowStatus); + console.log("Receiver FT balance: ", receiverFTBalanceAfter.toInt()); + console.log("Treasury FT balance: ", treasuryFTBalanceAfter.toInt()); + console.log( + "Receiver NFT balance: ", + receiverNFTBalanceAfter ? receiverNFTBalanceAfter.toInt() : 0, + ); + console.log("Treasury NFT balance: ", treasuryNFTBalanceAfter.toInt()); + + client.close(); +} + +void main(); diff --git a/package.json b/package.json index 49fb18a83..d7efe9bc1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hashgraph/sdk", - "version": "2.48.1", + "version": "2.49.2", "description": "Hedera™ Hashgraph SDK", "types": "./lib/index.d.ts", "main": "./lib/index.cjs", @@ -58,7 +58,7 @@ "@ethersproject/rlp": "^5.7.0", "@grpc/grpc-js": "1.8.2", "@hashgraph/cryptography": "1.4.8-beta.5", - "@hashgraph/proto": "2.15.0-beta.2", + "@hashgraph/proto": "2.15.0-beta.3", "axios": "^1.6.4", "bignumber.js": "^9.1.1", "bn.js": "^5.1.1", diff --git a/packages/proto/Taskfile.yml b/packages/proto/Taskfile.yml index b076dfa19..9a12e8f20 100644 --- a/packages/proto/Taskfile.yml +++ b/packages/proto/Taskfile.yml @@ -26,7 +26,7 @@ tasks: # using tag --remote in order to always apply the newest proto changes - git submodule update --init --remote status: - - test -d packages/proto/src/proto + - test -e src/proto/.git install: deps: @@ -79,9 +79,21 @@ tasks: - build update: + dir: src/proto + vars: + latest_tag: + sh: git -c versionsort.suffix=-alpha + -c versionsort.suffix=-beta + -c versionsort.suffix=-rc + tag -l --sort=version:refname|tail -1 + proto: '{{.proto | default .latest_tag}}' cmds: - - cd src/proto && git pull origin main && git checkout main + - echo "Protobuf version set to {{.proto}}" + - git fetch origin + - git checkout {{.proto}} + - git show-ref --verify -q refs/heads/{{.proto}} && git pull origin || exit 0 - task: build + - echo "Sucessfully updated protobufs to {{.proto}}" publish: preconditions: diff --git a/packages/proto/package.json b/packages/proto/package.json index 5fd78d184..ca407aaf2 100644 --- a/packages/proto/package.json +++ b/packages/proto/package.json @@ -1,6 +1,6 @@ { "name": "@hashgraph/proto", - "version": "2.15.0-beta.2", + "version": "2.15.0-beta.3", "description": "Protobufs for the Hedera™ Hashgraph SDK", "main": "lib/index.js", "browser": "src/index.js", diff --git a/packages/proto/src/proto b/packages/proto/src/proto index e19bb9758..141302ce2 160000 --- a/packages/proto/src/proto +++ b/packages/proto/src/proto @@ -1 +1 @@ -Subproject commit e19bb9758a3c22b2b6abe5427a58f3a787a2d245 +Subproject commit 141302ce26bd0c2023d4d031ed207d1e05917688 diff --git a/src/Executable.js b/src/Executable.js index 9d8140d64..19205c1b9 100644 --- a/src/Executable.js +++ b/src/Executable.js @@ -23,10 +23,10 @@ import GrpcStatus from "./grpc/GrpcStatus.js"; import List from "./transaction/List.js"; import * as hex from "./encoding/hex.js"; import HttpError from "./http/HttpError.js"; +import Status from "./Status.js"; /** * @typedef {import("./account/AccountId.js").default} AccountId - * @typedef {import("./Status.js").default} Status * @typedef {import("./channel/Channel.js").default} Channel * @typedef {import("./channel/MirrorChannel.js").default} MirrorChannel * @typedef {import("./transaction/TransactionId.js").default} TransactionId @@ -46,6 +46,7 @@ export const ExecutionState = { }; export const RST_STREAM = /\brst[^0-9a-zA-Z]stream\b/i; +export const DEFAULT_MAX_ATTEMPTS = 10; /** * @abstract @@ -62,7 +63,7 @@ export default class Executable { * @internal * @type {number} */ - this._maxAttempts = 10; + this._maxAttempts = DEFAULT_MAX_ATTEMPTS; /** * List of node account IDs for each transaction that has been @@ -314,10 +315,11 @@ export default class Executable { * @internal * @param {RequestT} request * @param {ResponseT} response + * @param {AccountId} nodeId * @returns {Error} */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - _mapStatusError(request, response) { + _mapStatusError(request, response, nodeId) { throw new Error("not implemented"); } @@ -610,7 +612,7 @@ export default class Executable { // If the node is unhealthy, wait for it to be healthy // FIXME: This is wrong, we should skip to the next node, and only perform // a request backoff after we've tried all nodes in the current list. - if (!node.isHealthy()) { + if (!node.isHealthy() && this._nodeAccountIds.length > 1) { if (this._logger) { this._logger.debug( `[${logId}] node is not healthy, skipping waiting ${node.getRemainingTime()}`, @@ -705,9 +707,12 @@ export default class Executable { // For transactions this would be as simple as checking the response status is `OK` // while for _most_ queries it would check if the response status is `SUCCESS` // The only odd balls are `TransactionReceiptQuery` and `TransactionRecordQuery` - const [err, shouldRetry] = this._shouldRetry(request, response); - if (err != null) { - persistentError = err; + const [status, shouldRetry] = this._shouldRetry(request, response); + if ( + status.toString() !== Status.Ok.toString() && + status.toString() !== Status.Success.toString() + ) { + persistentError = status; } // Determine by the executing state what we should do @@ -722,7 +727,11 @@ export default class Executable { case ExecutionState.Finished: return this._mapResponse(response, nodeAccountId, request); case ExecutionState.Error: - throw this._mapStatusError(request, response); + throw this._mapStatusError( + request, + response, + nodeAccountId, + ); default: throw new Error( "(BUG) non-exhaustive switch statement for `ExecutionState`", diff --git a/src/PrecheckStatusError.js b/src/PrecheckStatusError.js index 4e62e43fd..c7deee624 100644 --- a/src/PrecheckStatusError.js +++ b/src/PrecheckStatusError.js @@ -24,6 +24,7 @@ import StatusError from "./StatusError.js"; * @typedef {import("./Status.js").default} Status * @typedef {import("./transaction/TransactionId.js").default} TransactionId * @typedef {import("./contract/ContractFunctionResult.js").default} ContractFunctionResult + * @typedef {import("./account/AccountId.js").default} AccountId */ /** @@ -31,6 +32,7 @@ import StatusError from "./StatusError.js"; * @property {string} name * @property {string} status * @property {string} transactionId + * @property {?string | null} nodeId * @property {string} message * @property {?ContractFunctionResult} contractFunctionResult */ @@ -40,12 +42,13 @@ export default class PrecheckStatusError extends StatusError { * @param {object} props * @param {Status} props.status * @param {TransactionId} props.transactionId + * @param {AccountId} props.nodeId * @param {?ContractFunctionResult} props.contractFunctionResult */ constructor(props) { super( props, - `transaction ${props.transactionId.toString()} failed precheck with status ${props.status.toString()}`, + `transaction ${props.transactionId.toString()} failed precheck with status ${props.status.toString()} against node account id ${props.nodeId.toString()}`, ); /** @@ -53,6 +56,12 @@ export default class PrecheckStatusError extends StatusError { * @readonly */ this.contractFunctionResult = props.contractFunctionResult; + + /** + * @type {AccountId} + * @readonly + */ + this.nodeId = props.nodeId; } /** @@ -63,6 +72,7 @@ export default class PrecheckStatusError extends StatusError { name: this.name, status: this.status.toString(), transactionId: this.transactionId.toString(), + nodeId: this.nodeId.toString(), message: this.message, contractFunctionResult: this.contractFunctionResult, }; diff --git a/src/RequestType.js b/src/RequestType.js index beabdc846..9412ccf8e 100644 --- a/src/RequestType.js +++ b/src/RequestType.js @@ -199,6 +199,12 @@ export default class RequestType { return "NodeDelete"; case RequestType.TokenReject: return "TokenReject"; + case RequestType.TokenAirdrop: + return "TokenAirdrop"; + case RequestType.TokenCancelAirdrop: + return "TokenCancelAirdrop"; + case RequestType.TokenClaimAirdrop: + return "TokenClaimAirdrop"; default: return `UNKNOWN (${this._code})`; } @@ -369,6 +375,12 @@ export default class RequestType { return RequestType.NodeDelete; case 92: return RequestType.TokenReject; + case 93: + return RequestType.TokenAirdrop; + case 94: + return RequestType.TokenCancelAirdrop; + case 95: + return RequestType.TokenClaimAirdrop; } throw new Error( @@ -776,3 +788,18 @@ RequestType.NodeDelete = new RequestType(91); * Transfer one or more token balances held by the requesting account to the treasury for each token type. */ RequestType.TokenReject = new RequestType(92); + +/** + * Airdrop one or more tokens to one or more accounts. + */ +RequestType.TokenAirdrop = new RequestType(93); + +/** + * Remove one or more pending airdrops from state on behalf of the sender(s) for each airdrop. + */ +RequestType.TokenCancelAirdrop = new RequestType(94); + +/** + * Claim one or more pending airdrops + */ +RequestType.TokenClaimAirdrop = new RequestType(95); diff --git a/src/Status.js b/src/Status.js index a049c43b4..9a4d70cd7 100644 --- a/src/Status.js +++ b/src/Status.js @@ -677,6 +677,18 @@ export default class Status { return "EMPTY_TOKEN_REFERENCE_LIST"; case Status.UpdateNodeAccountNotAllowed: return "UPDATE_NODE_ACCOUNT_NOT_ALLOWED"; + case Status.TokenHasNoMetadataOrSupplyKey: + return "TOKEN_HAS_NO_METADATA_OR_SUPPLY_KEY"; + case Status.EmptyPendingAirdropIdList: + return "EMPTY_PENDING_AIRDROP_ID_LIST"; + case Status.PendingAirdropIdRepeated: + return "PENDING_AIRDROP_ID_REPEATED"; + case Status.MaxPendingAirdropIdExceeded: + return "MAX_PENDING_AIRDROP_ID_EXCEEDED"; + case Status.PendingNftAirdropAlreadyExists: + return "PENDING_NFT_AIRDROP_ALREADY_EXISTS"; + case Status.AccountHasPendingAirdrops: + return "ACCOUNT_HAS_PENDING_AIRDROPS"; default: return `UNKNOWN (${this._code})`; } @@ -1325,6 +1337,18 @@ export default class Status { return Status.EmptyTokenReferenceList; case 359: return Status.UpdateNodeAccountNotAllowed; + case 360: + return Status.TokenHasNoMetadataOrSupplyKey; + case 361: + return Status.EmptyPendingAirdropIdList; + case 362: + return Status.PendingAirdropIdRepeated; + case 363: + return Status.MaxPendingAirdropIdExceeded; + case 364: + return Status.PendingNftAirdropAlreadyExists; + case 365: + return Status.AccountHasPendingAirdrops; default: throw new Error( `(BUG) Status.fromCode() does not handle code: ${code}`, @@ -2973,3 +2997,36 @@ Status.EmptyTokenReferenceList = new Status(358); * The node account is not allowed to be updated */ Status.UpdateNodeAccountNotAllowed = new Status(359); + +/* + * The token has no metadata or supply key + */ +Status.TokenHasNoMetadataOrSupplyKey = new Status(360); + +/** + * The transaction attempted to the use an empty List of `PendingAirdropId`. + */ +Status.EmptyPendingAirdropIdList = new Status(361); + +/** + * The transaction attempted to the same `PendingAirdropId` twice. + */ +Status.PendingAirdropIdRepeated = new Status(362); + +/** + * The transaction attempted to use more than the allowed number of `PendingAirdropId`. + */ +Status.MaxPendingAirdropIdExceeded = new Status(363); + +/* + * A pending airdrop already exists for the specified NFT. + */ +Status.PendingNftAirdropAlreadyExists = new Status(364); + +/* + * The identified account is sender for one or more pending airdrop(s) + * and cannot be deleted.
+ * Requester should cancel all pending airdrops before resending + * this transaction. + */ +Status.AccountHasPendingAirdrops = new Status(365); diff --git a/src/account/AccountBalance.js b/src/account/AccountBalance.js index 3a7ae31a2..d2e9d8a6c 100644 --- a/src/account/AccountBalance.js +++ b/src/account/AccountBalance.js @@ -48,24 +48,14 @@ export default class AccountBalance { */ constructor(props) { /** - * The account ID for which this balancermation applies. + * The Hbar balance of the account * * @readonly */ this.hbars = props.hbars; - /** - * @deprecated - Use the mirror node API https://docs.hedera.com/guides/docs/mirror-node-api/rest-api#api-v1-accounts instead - * @readonly - */ - // eslint-disable-next-line deprecation/deprecation this.tokens = props.tokens; - /** - * @deprecated - Use the mirror node API https://docs.hedera.com/guides/docs/mirror-node-api/rest-api#api-v1-accounts instead - * @readonly - */ - // eslint-disable-next-line deprecation/deprecation this.tokenDecimals = props.tokenDecimals; Object.freeze(this); diff --git a/src/client/Client.js b/src/client/Client.js index 63a0ed651..3bceaf58c 100644 --- a/src/client/Client.js +++ b/src/client/Client.js @@ -148,7 +148,6 @@ export default class Client { this._isShutdown = false; if (props != null && props.scheduleNetworkUpdate !== false) { - this._initialNetworkUpdate(); this._scheduleNetworkUpdate(); } @@ -767,30 +766,6 @@ export default class Client { }, this._networkUpdatePeriod); } - /** - * @private - */ - _initialNetworkUpdate() { - // This is the automatic network update promise that _eventually_ completes - // eslint-disable-next-line @typescript-eslint/no-floating-promises,@typescript-eslint/no-misused-promises - setTimeout(async () => { - try { - const addressBook = await CACHE.addressBookQueryConstructor() - .setFileId(FileId.ADDRESS_BOOK) - .execute(this); - this.setNetworkFromAddressBook(addressBook); - } catch (error) { - if (this._logger) { - this._logger.trace( - `failed to update client address book: ${ - /** @type {Error} */ (error).toString() - }`, - ); - } - } - }, 1000); - } - /** * @returns {boolean} */ diff --git a/src/client/addressbooks/mainnet.js b/src/client/addressbooks/mainnet.js index ae1b0084b..a5acca1f6 100644 --- a/src/client/addressbooks/mainnet.js +++ b/src/client/addressbooks/mainnet.js @@ -1,2 +1,2 @@ export const addressBook = - "0a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039303938383635646566326632616233373663376630663733386331643837613237616330316166643030383632306333356362366562666362623063333330303331393361333838633334366433303233313732373031323139336262373666643330303462383634333132633638396566353231336362623930313130313530396465616239346632366137333265363337393239646134633463623332353137653361646262333831316435306163346337376331666365386236353136303632313566333437303766336537323635353435653538633839343630396532383337366264623737373566653330343339653065313539326664636230633365653163333035373733643037326136623839353765616663653161313162653936356564616666333834333336366362366134346563323561383930313036653632343735363766373662353530666461343832626165633633303764363938656338383834316664363666323366323130653437623861396463626136626134653166613731366462333363383065333038313934393664636235653536303966623665376336313533373962646465643432376539323331623932353463326261663934333630386138366436393861653961336338363339646638383764366636623561373133383564323433333864393131613231326266373166316532616363386231383662393665633865363963383662366430353832313737373661303963396336383935336564623539313635373862356132363362326634363965336230633037656164613731613434376565613766386663316262383037343235353536376237663062643165366166623033353837313863393862343239653234623232393835393666633736636636616633393663613934333464373932366563376433376434623932616635366434356665666638313936303935323234613931366331666665366236363765323535666333616338636363656639323064633034346232353030333133326238373830363734326630323033303130303031280032060800100018033a60333432343464353061386564346434636261646632353632306431616238386133323038313937376432663864373062613832626135326233333035613435363038323463663662303130366436333565643563333932373266666661626538420a0a0423edc8b410a48803420a0a0422ef520610a38803420a0a0422ef520610a48803420a0a0423edc8b410a388034a22486f7374656420666f72204c47207c2053656f756c2c20536f757468204b6f7265615080f0c7f898f29bd5010a940822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039313331616133363866393334353232396639376236323539636363616666656132336530306364356561643032653366363936633165373134656533393339646164383630653338626639356132393734663965623438653933343366386161633430356561393535643035333233653131376233623163393438313361336166343266653830383263336434336261663162643464383336376539336462303061643639366536323761313033366165353334663031316561643565353666333761366666653434623662396530393934303131393261643536306130333436623431613831303039356635663264376664333264366565623635356261373538633662353236633132393338366166373139376337613533616536303364363232383332323534393631663136643065666138303739613736383536313838386265373333343932323137393536626263616661656262363133356335666262323438346435623461356664663033333661633032653236633136353263316264386561663330646165316436643365623030663762346661623864363437386665386439356562393131646639363661306465613465353232646237366238393636353730656363356166303935313634323466306166356638656536366533383664353635303731333939373136396163333735373362663532666430353864653935616232666636386536383131316162323334303565613936346232626238386430326330663163616564373165636464346534653430383539343837366664623835303062633535633762613032303636653035616239386439663765303436366439373032656235376565333732326638666363383561373535303566663332363231373032383862373838373233616462393765346465353632306363393065616431333832666364373537313838396665666231316536373731626333663666336665623139633761633534323837386430336139303237303532366333656564323439346566663534653135336361396636383930323033303130303031280132060800100018043a60303164313733373533383130633061616537393462613732643534343363323932653966663936326230313034363232306464393966353831363432323639366530353639633937376532663136396531653536383861666338663461613136420a0a0423babff710a48803420a0a04038234ec10a48803420a0a04038234ec10a38803420a0a0423babff710a388034a1d486f7374656420627920537769726c6473207c20496f77612c205553415080f8cf8dd3b596f9010adb0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303062326363616336356164306663373634356138313762666162633438376164376534313331316537613331393862333766623834326438346333393562336636376436626438343866313063366630336332393065386637646161386430303161383434316463333532613139313630613331393365363862383265646631396165363736393361396133336434636238376537383961313037303731353531356561373732636161386238366135363962393163353435303833356439633335346630646163656339376665373730393162343562313437363938623766383630313432326463643232363165393238646534646163396334326463626166646639366330373233336261333032373037366633376339363965386564333062366235643866353033346265376439326335393666386265383631653531666363336132343262663964386265396532613965386530663135356562636666323365666661376364353763313035343238313164383037373663393538353532366664623065616133346565313935356435313131393339306665383733653463303464656464323931363538383462393862343633303837383861653766633464346161346138666339626332363734626133323134393362363234343535616434313063316465373162633935643164393166613066323031343138613739356533303965616632393762363939626632376339666132373633636435396365623032316531366238323030633130363066323831376664383363666337363731383334383934363165333539393239316233383064366539333962616134623139323332613661323732646465363531663830343666646333346462323736613737376436666232626563333235356232636332343462346166353636623130356633306336353036646461653065623364656464636639343762636239633630653030303938346633623461386336633465643462663930626331393332623766393464633361653662333630303038656239303230343066396230323033303130303031280232060800100018053a60653535633535393937356331633932383563353236326436633934323632323837653564353031633636613063373730663063396138386637323334653034333563353634336530333636346562396338636532643966393464653731376563420a0a04176fbafa10a48803420a0a046b9b406210a38803420a0a0423c0021910a38803420a0a04031212fe10a38803420a0a046b9b406210a48803420a0a04031212fe10a48803420a0a0423c0021910a48803420a0a044a32752310a38803420a0a04176fbafa10a38803420a0a044a32752310a488034a1c486f7374656420627920464953207c20466c6f726964612c205553415080e4fbd8818da49f010aa00822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061336533376237366336636435663636323264363932343434346431326336373763333935663262353930326633626239386238613862353035356137303737303663613032386364373530363061326438373032643264386230343934376264636665306138633134316161323834346231653036653636313930303132653862363332366162306661333137393733626337636234643239343966323130386161303463346230633931626161353732386635623536323265633735616266353738613166376234316564653261363765626436396331386535383166646639633630323061633064653963613263333166306336343639303033333131666262356365376462343963373837653161376432376161343235656537623834646137653636393339663963383064306538326663653535653032646663386235633738343138613236616134333635303639383731396261666365636630626434393030306164646366613430353730386264626566626231393734396432326461623030376534346434356561323362313036663838333463313532653235303632643463663234666632353335366337656233373239313035333933666234396261623930346130326630663062623431376364393139643335323839303132386536626266663466616339663930646531313861393734663261366464303165303332613739623137386636306661316663626264303262353730346662343632393563313531393038313633373365646436363335633835363937386631623935303366316637336234623062653861626132656431666565616435393935336266383265666465393361333437316162643535636461336261386136373366626233373939373439666230303664303033663065363366363635633334363164326137623239646338623230346261353961363536363861343661653238373866303064316639343930646639653238306665626634333135656130346561613536386133613966643438633632633633623665636461363930323033303130303031280332060800100018063a60623837303764643839313632316231306663653032626436656132383737333435366630303862303662396461393835616532646131616436366265383233376366383331666335623862346665613534353935313739653937333564356432420a0a0423c7a16c10a48803420a0a040d346cf310a38803420a0a040d346cf310a48803420a0a0423c7a16c10a388034a29486f7374656420666f7220576970726f207c20416d7374657264616d2c204e65746865726c616e64735080e0b7cea4eba68d010a9d0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063343536316533633237386364363530653830633431336361343434323363316333633133636631343735663666363937366435393761653433326234396162343230383662373962383431333236303534623862336463663537643866636437396266633035383138336361323463643463316362633537346564313131376532663562376233633633636537623036643962346566636637333735363337623431666536663533633831316239646536313433663361353239353763646639353637373531323062333337303366663537363231343037616239353735626332643335633064343466303938336663316566363361346666353230396630373063393261663130363239353630316339366263656430363465633139303139373031396336383131633463386464383063623466346163373166396164373665376163383934353666626634663031316639306162643264393035333665383233343635316636626566393237653364356438623762663435393035303938336265636133616265663261396439376166333435373732613737343065393639393237356230313865613064663238366164643663653932336566393038666265373632613735663231313136383632646234346433646361316434346234643265386463313036366335303036626235613764393534616432353564346236303332373334373565353131616562343835643036396130363763306162356332343533386339333363303662356136616566613934303035633239313532313365346363646165366339343266363237326639646435323832643662383930663166323065666432333939636436373439323466613537303436616336646133326537333935316137333131336539316663326237666632396534383531623833666633396638336261396563366630386365666462623663626262666661626664666161393164393330663732303064613438313337633339346362643133653730316563646332363136666432316261643638316161346630303130323033303130303031280432060800100018073a60623863336339613161363430336161353536633462393663383936343339323563393831643565383364323963616665643739303832653331306531656234663135623536396337396664626332343136306238393165633732316663613337420a0a040372360410a48803420a0a0423cb52f010a38803420a0a040372360410a38803420a0a0423cb52f010a488034a26486f7374656420666f72204e6f6d757261207c2056696c6e6975732c204c69746875616e69615080e0b7cea4eba68d010a9b0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061316334303737313534333033636337326334666237363932633366393432353162646563313233396131663761383937326162653931613335333233666265636136323561376666616536343036633835356463326166323131303930306230646630653665366462373633363464666131666665383565646135363739333665323938356238353633346133326161353261363539396464366333306265316637613663356238663565656361663236323164386134353936383266636432646261616431353631643131663333666363623766353530306163353638643136356462656161636533323836643238393466363431323964373831643663373266643764353939633965316433616634616134333363323362393130666165346334383431363431663631353236616437383765626561353339383734313637653964336137336363306662313536343239643135656337363361366430663036313135613739623961663738336437376239386438333039366161343734336639373430386439653134626366346464666665343539313736383834376234306362386461376361333735323536643262393335643039356665323532666165383166663665333766383464376139306437653537306134663865663363376437363665656461343732663039323031393930313561383930383235396138373363353435346663626264636164326535323864653835343535623430383363376463346164633561393838653063646466646331353964356437313261626435343461613733656330323930383938313463393861343466323666633036343436353963313833653331383461613237326638643164633062666133653061353630343834636230353562613464626235636333333965633830626431316436343264633361373032653863373033616232313933303834643962643633663064666531326134333363323537366561663738316366616438363765663730626461363137363862326265663134663530633663336238623039366630323033303130303031280532060800100018083a60346134346462616664353064636539653139616536353935656663663237626164666537396462383866306532393163333262303363306666633936383330623339316331343331313436313132353566356137366534613333626130333139420a0a0423b7429610a38803420a0a0423ec05db10a48803420a0a0423ec05db10a38803420a0a0423b7429610a488034a24486f7374656420627920476f6f676c65207c2048656c73696e6b692c2046696e6c616e645080f0c7f898f29bd5010aa10822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039336132313563633461376137323263616539633133616264363336646639396363656563366166396462343662363966613531363731366566353063653234393061393831653039616230313963613263623436383131623562363139643162643164356565366634366134326337373763626465653634326131343834656364663564646433373239363432633338633664343361383835383837343437356635383234343433363634633034646665643962383930343566623038356532356333656663623438343137333365666637633532396331333965363933353063326364373962326338643139363739613731326534653863616664333236373534316238333262336531306130313235356465663639646631653964336238643865616630333131646536376435653132623236646430316462626439643365343264333564396465323731333032653066316636396438376362633761636139653838363765396434323864336361623036363665623439306435666261623330626666336637383564303366323037326134336262396235653534363536613539326362363165616664356135656632383463376361656336366637663437333235636330643463316432376636363164386137343863613530373163303665663133346466663936663430383636383833363664343638613234373830303137653062353661626137666162343362336237633062373739303666616535343832663332383131633239326536623134343534653134623839343830316138366130336363343737393464643064373435323761373265343234656433616661303438393965636239613633663261396165373262653766613938396164663064363561333263383531643938303166633431303438646633333536346663376233313730376563386662383031343066653762376131666131323062613163623636303332346365666662346263633264396262376465306366353463383139663264643362636561646563396332356635653139646339623130323033303130303031280632060800100018093a60393238316639613166303537653964653636666163343433326362313362313032643930643563633565613738373438376637313430336362363261613830393937366636356363336235656461333861316333336137313962343662333033420a0a0423b59efa10a48803420a0a0423c5c0e110a48803420a0a0423c5c0e110a38803420a0a0423b59efa10a388034a2a486f73746564206279205a61696e2047726f7570207c204b757761697420436974792c204b75776169745080b4f6ca85e0a787010ab90822cc06333038323031613233303064303630393261383634383836663730643031303130313035303030333832303138663030333038323031386130323832303138313030633537656462396666323736653032336232383032316362316438376364663139363662363938636634386534656161613763363932303737636565653863636232333961346339323135393765386538396637636330356433663331333135373839373663346533313434303564346134653033613732343130633563303963613532376164356138356239393836333765373261333265316662633064353534366232343635653965383036633264643530396562303530616235666232373036336664393238313562316464323638396532313131636165623666353439653934613966303066303832316434636136633661363131376635613533336339323633626630373461333064356362656635306431633863323338376263613937326564656461303938336235643061366235376463623030323030303638323862343065343037366234383730623234626164383430353665653532623566343232653838343030323863323530303633383264386539633636313232356634663736656137326533343036303765396663366633633230343333303736613163613863623135656430336163383936366430353037626364653638316534653032333165653966383764313131653762343861633866393464326438343262353264663733663537336363353431343936343739376336323639363866666165373431386633623631303962356130663039653332323366346134643565333530396464323530313338663662633137626636636563653137353934343330646631383061333865393061646632616666626661643063366238633162383766313738613036316463666266663862393263393136366438373463316666356166346662636462666538653964303939333730646466363062653734373633336433366565346562356364353166366533633333396531353165343162646235613563653263386339376130613433623363643463633038313838346338373966396432663337343834323863383537336631376339306633636264303230333031303030312807320608001000180a3a60373462636363393430333338393661613435393435343538623838336239383134336633643236313032316264653834373637356335633762306430663639313664656664636438386632303739303836613231663664363335343730393165420a0a0403f81b3010a38803420a0a0423f2e99a10a48803420a0a04b19a3eea10a38803420a0a0403f81b3010a48803420a0a0423f2e99a10a38803420a0a04b19a3eea10a488034a2a486f7374656420666f72204d6167616c75207c204e61616c6477696a6b2c204e65746865726c616e6473508098c5f1dadb9dc9010a990822cc06333038323031613233303064303630393261383634383836663730643031303130313035303030333832303138663030333038323031386130323832303138313030396264643865383466616461613335333266633463653031613861313764346333623233326635306139373930653236323638346564633438323365383135613162643562323065636561376266353665323966366262376238333166623362663665666364313437356630623865643566666230623133383562393664313636623632396630333936613866656635663036653462636132356565346131333430656532363361346439626230323064386634373233303666336438383631333864653761303139653035396264306166633930326363626131613231336165326461613630633861303133373535666530613438653033346635623430323361326461646561613838633534383638333533616337613761336466313262326662363431383737346539623134626536656162386363323762383830313261643631363264613734653065656231363133353930356634333733373464616238353836643735306132366262643361633234616564383738633464353365363531303732633837316539346437616363353735633936373338313733346135336665616634643762613662636464323431636336343538633630383764383633303261613235316330346636643536623963333264376439363632343735306564303535373835643037373366343364633039396232386339323238313134386536633831663239376666396431363665303030616330346233313234313836373735666365663735663565626130633130333262663133306466366364376134363231316430646633653035383464393265613637333439643834393035303865623465663838663534633863336434383664653837313966313066613936666562383563633739363037366361373831333138656532643965643930336361313333363034306335396164393161346432663639386539313038616530656462396231636239356164333362313937666662313862643162613862353663626565326161653935383565636532303861316531346234383536343633303230333031303030312808320608001000180b3a60373033316631353431646264376236666537646137303234303236353832306433376637633532396139333334386635306437383432316231383739376537623135636465376430653566303537633838346238376430393365376433386635420a0a040d3577b910a38803420a0a0423f0766010a48803420a0a040d3577b910a48803420a0a0423f0766010a388034a22486f7374656420627920426f65696e67207c2057617368696e67746f6e2c205553415080b4f6ca85e0a787010a9e0822cc06333038323031613233303064303630393261383634383836663730643031303130313035303030333832303138663030333038323031386130323832303138313030393032353966346533643966306633393432353635343865396337333038623130623733343033636339303934643937616431353162373730363137306239373732636562363464363632656365663930316138643764313564333139613539633862373130373161636364383935623763393336313064633639373666363763346531373239626138333733616237653532613366336338663236353439316464653639643665303939393437306537343435393831313331626439366333366536383635323033666232656264356435306561646166623732363339366465633164393137343839386234653962653034633734643330346665616464396362643332333463336237663333303663393963623063333339666332353936396234316435386132623763666331383332653232366438316331393633393933653232353561303837643136393863303364343231306264363435383036343464303935636137366161313739346564643430633163383762356638326138653339663630336539373131366261303435373865376538303334363439356437383564346566376366373731346239656236663566396530623961393466346237333838343631396239323734643461393565663135373534613839643937656635633161383862366436393365306138306562643533376663396366306361393164316336326439313564653765643831386239353265363463323030323933656538653238346134313661373261336531326663376434323362313538663962343936363063626332343636666265643066656432653234653130326664653934326562346366643934626563343664336439306663303863333966656362613033653063613234363461653636346239373935313562613239653166373032633366653730326265373933373936643865646231376161343863303932393062303234353439663036313166356165323365643765313634343264663764316461643232383663326262303964353532326464336564363938633266303230333031303030312809320608001000180c3a60323030636462653835346639383561613664366264313539613234613033346561626539306438333861383438306638666230653665393265623563353762653265636265353461333263373161653466393731653363333666326637306339420a0a0423b1a2b410a48803420a0a0423cc562010a48803420a0a0423b1a2b410a38803420a0a0423cc562010a388034a27486f7374656420627920444c41205069706572207c2048656c73696e6b692c2046696e6c616e645080e4fbd8818da49f010aa30822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303038326465373330363566333466666332393334306435393439643232323062316534333636656435636637633665626436313663663934313661353365613030313766366262313136626664336633646566636331356237613464646630653434643032666536393536383830353365373961373730653230316263663731393333393030333965653866303836643466613734366337653035363931383330316639623565383465333932363238323830383561373962333232626361306235643835666539373232316132366262646532353863363230663064636561303261623165646431366363343961336632616239323838653364643166333764633462366136663731333366663932653534316337316237306432613266363664353537323561623138626638366430303965633364323466356431326530623565363830326431313531333732643462373634656265636234616638326636343934383565633537623561303164633637393538663561303363636161623763626139333534613137333732633133313662613437633935336161663934393031623366386332346536613361666436373538653766336231343363653264643363623037316232613734633932316365653934396134623561366265383739663163373930613662386436336231393264376565323961393439316664643638396139386330613763336436303332306631623461633264363232396466643934653432663361363034386137366265316562393538633861313837336265386433333861656339666335396162376633373632363738393430326331666435393566313930383735373565306265383237666334633061346662336433393361643734613934396363393836626662363463616264646165353339333566366463353630373464623933643737656133623831366264643662653533343439373237323238393835396666333463653531383630616666623632316431303438376463333834336631663836643534303334613633653438613161306430323033303130303031280a320608001000180d3a60303762373763653238346637656262356265623037623130353337356166353564323238613736356531613834353837656231643166316230363735633338613164313531323337306535366632316338656435656164656662333737396139420a0a0423ea846b10a38803420a0a0422d7c06810a48803420a0a0423ea846b10a48803420a0a0422d7c06810a388034a2c486f7374656420666f72205461746120436f6d6d756e69636174696f6e73207c204f7265676f6e2c205553415080b4f6ca85e0a787010a910822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039383735356134303862353332316532363330353230303064366437643461326333613535346435653133383461396362356562663437346165383832633633623438366264303864313434646466316139346365396137643632353139363330303661666461616334353838343666313736343031393566653235333961363536393330656661383534663231343865363865633161303863316334396432303063336633303435666537313437663036643533346334626432363231303063623164643339373339643736306438316130626432306638336632353564323530376434636362313130366235333631386336613934343039633838376361653236326434636565396338363233323134376365633134303465306335376262613733313731333065653339363433383838616633643539386564643832623863363165363561653831613465316135366263303664333937313433613938643431636138376433656634333365663061656162363830313139316233653338343830393638663636623665383836363261663435613965323132393934663638623238386562393637626562393834373863323433653231333663316131353931663036316635626330346232316666326261343862323966313834333130383838373362646665393966386135326539343038393731383536653830346465613630326133313137383663393835363532393633633361333737303332396234303966373466646663373436623232613566383431383931323037316334636538343663396234623332306665646636653962363465326362653338346639613832623661616164346232303930373433316466316133336636393230376135363536303062653831303730643038333239303039393538353961343439386435623539333135626365626566656538303765623061336139343266316364663333363764643434343466646232393838366566636464306265346162653961313838383033393533383735656461333364623732393839663736336230323033303130303031280b320608001000180e3a60353061666134343861336137386236313566343966656635373762643762363262313330383265623535326366383839353130396530653534333866373961633861656432663261343865326635373034393037343666346334333931303462420a0a0423ec021b10a48803420a0a043408158d10a48803420a0a043408158d10a38803420a0a0423ec021b10a388034a1a486f737465642062792049424d207c2054657861732c205553415080e0b7cea4eba68d010aa60822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061396462376638626161313236383938666162373839313135613362356438393734346631393765323830343161653039386633653838366336393837313732316531316262306164313166336365393132346161393631643661306463383435663439373635633366616231393935383430323637366635363434363262663238316462613535383837383066303365393035373938653138343236396161613630663761313437323333316532666231646561646438373763383463626362363431636139653563386164366534356263313539636230373966636230643434396364636438643932333963316130343765376234343864613063646361323636313061323566323936643936653734363962363736643461343434353136653761353965383532393361383038366638343063303532383534653032613863623230303264616433353832356265346438336235326661393165386337336666303439373436313438383632373837633131313866393234643331636261633162343466656666323264343336623339373965616466396234336134626661373265313562343735356663616232363065303661323739633362623733626337663136613036306434643532326664343930353830333838616135393564383034343733366535323266363432343931356637383033623735383365303935636466373863333235313936393764653831623839666235303035343735336231613137663961616662303634643834633939326639616231316363626338636231303831346463616635323634616134356632316264656661633832636361636161663335386533313337336565316261346537343032666438613730656130633238636135636337346463343235313063393639636432633435396231656333363838613031656133396139393237313063643232393763393861383462363334386135373738303466646332333464336665313930336532633231653137326461323862353961653665346337653865646438623731633439643730323033303130303031280c320608001000180f3a60633637313364383765336331663638353961336133363633656262316237653162643164613134666366303736636535316433363436346235363832613564663763666164643434303139373536346634393838343233313330393163326264420a0a0423e40b3510a48803420a0a040379ee1a10a38803420a0a040379ee1a10a48803420a0a0423e40b3510a388034a2f486f7374656420666f722044657574736368652054656c656b6f6d207c2048656c73696e6b692c2046696e6c616e645080bcfedfbfa3a2ab010a910822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061386365616333363765623166316465356630643965663365616630646639623938343438666532303830383437363536326130363063353163323839373730623463616366653932636236353536393832336539363263326132633966656435336264333663613361313232646531633532356135383266323561346437643632386331613364356264623839333661656365373531306537353534656537303333303235633039326338323865656235373338626530326564393633646138316135393230353633346365393435343537376162383266343066313366316565353565306165373237653233633330323834623166343462393961636534646463356639616337616438386439666132323535393335623234646362613834303036343265313663663235333263306230643638393239303436303837313563343037366634366438346130653066656433366537366363646339363335356537613236313630393435633262353461653236636330306664303832333236333436656565656137646437356639313931316539396462636239396561346163366261303536633333323238643838316438353833316439636338373935393364613137343664643065653935646332623936666539336261666366663263643764393239353864373864663333663230356437313135656439666163346462366634636336306535366135343431646135623562353566613539393939303265393538613662366334346438313064646335363138313234316238376632326630353961363838306538303231373336643031383937646236353434396365383137613233373564303335353163623064653530376336303961306338303330656366346266646562323133633033646161373634613138323162373234333334663731663736386437616563623237373035326137303333373635663037323138303536633738663261383761663138333836643866363161356366636233663262613464643539393135663133643338363334643136393537353730323033303130303031280d32060800100018103a60613533633865623730626464383965646236626535666563353063666162633038313030326134373761663437386565666133353565613665653537326534616535306538343938386638656132633036386166613738393637623263616630420a0a04129ddfe610a48803420a0a04225bb5b710a48803420a0a04225bb5b710a38803420a0a04129ddfe610a388034a1a486f737465642062792055434c207c204c6f6e646f6e2c20554b5080b4f6ca85e0a787010aa40822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061663062393134323537626637613436353563346135306430636164356530613165343538316564363632336630653837333066373936623866323963353831373862636363363933326331666333316633396566343462383264336334336233393837333733373366656362313239353232386130346664353061313466333634366438346665316634363763616562393864343633653239373565393935623864326531653339663362663661646463323561653335643635643032363038653033343535333739363665326162636534396238313462656164336331623735373137346165333063303062306334336539396238303439366237326433633133316631633665346663646130356632383131376566396532386334333033626534643863376530343264353862383363633132313934356132633635653739363263616139313835393338663337353764663763636139356366303262356533313934346133613631396130616333663165333462396230313364346332323463346631653730666439666433363938336566383661646535313833363263633833323263306637623631613961633735666238326537623836643638626330663039396130396131346361633561316438643338663961386137306363333766663563633362626432373432666664313436323535633137316536613137383038333237316463653066646536383165643439326362353962303739366432373031373538333864633539303831303765336136656133663961343036623364313133306363656333623437393165343962626332333136303362343661623264306639336434336265373561623961346437313065613934306532383561376231353362306361376364646565366439646365306164383335306334316439306332313562393538383531356166613061633333363561653037653831663362626233366264626561633462333162636231616134653832353635623937376639646164383564363236656566396161613965663864376533666230323033303130303031280e32060800100018113a60623562323865366635373234303733306364613830326335366535336238383337613764363364616239623362336162313536613034643965326536653234623637393063333861356664333335626536376139353162373762656563373438420a0a042256d4f710a48803420a0a042256d4f710a38803420a0a0412e8fb1310a38803420a0a0412e8fb1310a488034a2d486f7374656420666f722041766572792044656e6e69736f6e207c2050656e6e73796c76616e69612c205553415080e0b7cea4eba68d010a940822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303038633037626533303561643630623930626132646162333962306565373736306531613232663835373532323534306437306230336233663965343837356133613239616230383038386631343466353765623235326534366261353933383564306536643432373031313764613061626331623362383036393463396135303538623836643631646661303665373136373039633838653866656163376333613065316432356663306165626636613866373666636239396638343566653138313436316361623638353862393763336134303237666233373132623134653663303738396465313764343137363435373765353131343137656231363236393265623037616531653733353532333565396262343339303437623663303136313337383265376464366636303464616134363734363631643533393631663436633366616136623765373637363264333733623562353432623739656139363365666266333361633638313938626232623636316366663637363931366566333732616434633236633231366334626334373837633834656333326431383464373763373531383663303963663364396639313433336361393835333131396261623331666136616432366634353365353936643962646563613638613537363962633866656537613533356438306338633666336566623164666232383861623661393739383534623763653833313234656330643130326166663934633362373466396333373839353863323565623933336464353363316538303561313836353464366439313836393930663635373034323966393630663334653862346637666439393732646362666539323430653037346461326433353561356637656639633161663632656635393832613831373435373862396331356334396563353636626461636233306363666365663039636466653730386164343837343234653963316265363533663965653736363065376439343263316566613564613238366531616464616230366139613333663964653934363739356230323033303130303031280f32060800100018123a60656239373639393565356432613964613639633434623036646633633239656363613565626135303038663035343037376330656538376230383831333331346334666439316563383334643362383638666237656537373934663463626562420a0a048d5eafbb10a38803420a0a048d5eafbb10a488034a35486f7374656420666f722044656e746f6e73207c2053696e6761706f72652c2052657075626c6963206f662053696e6761706f726550808cf9d1c3f6a593010aac0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303062653137633939363437636563363561343434303762353335383536623363336261656635623534663536356166353862383435366261386337636535333564356163373263363163343463373662336335376338653836343834313633376265313061383363666533396330393234373664306462653464366364636463643732306133306235626665623531613031613138663538326334356636633836393933666366376466313832393335646531643836393036303434646366333531383639333564396264376565613739353233353262656262346566396165306637363631653730613432333761666139383939363638376361343866636663356230306433383037663035346265306661386333626661343235303338626536656632393531363466323266373362376538386339346561396265386161346633613234356338396239643166643531393266376135306239353862326566383130346233366631626638666432636662323863313432313830306331633437653465663938616631353030373063633664363964313765386562393266313861366161316136353236366134393532333864313033663866363935623537656366333733363530613035323030383734353732316265613831353632373936376338303736333635646638633463376137643464643866326333383530633138666261373165623630653665386466626431393665303533376664373062333434656362636335333064666338336461366665646634396435316139303431393530326261396437306364333566316366336330363934653233353466393036346664626635333565623233633237633061343364306237386331663836376336316439383639356438646566376263326131306262363637346332326636366161623061393138313364646632376364623835326335396566373965316239653161303735666136656532376137653337373464626634623236343635343237653664356162393166653766306633613731373834656361313832623530323033303130303031281032060800100018133a60643563653666343337386436643534373233393438366566643661373032613734666361396539363537323366306561343365656661333262653938313739353038633432313835666132333735306432306538633066316361316435363361420a0a042259578a10a38803420a0a0412a8043b10a38803420a0a0412a8043b10a48803420a0a042259578a10a488034a35486f7374656420666f72205374616e646172642042616e6b207c204a6f68616e6e6573627572672c20536f757468204166726963615080b4f6ca85e0a787010aad0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061356164326237363433613034633035356432663863643235313162313531333966633435353735363231333838653439633131396232663339386163613131306636313339366230633836366465353036333532326262383534303237336531336636643934636531653630343338663661666230306161613634363132663731343565396263653862633161353362393431393133616137366339663361323833336661643763663238356337616332643337663939663363326364623439646534643135316536313637383536346632383166353431343234623431666137633531623261393630323238336337643332656530306562383338646131356333386166633936653036316439376365646532323136356666316161393539663163343237356232643039386334303538366135353739666262336362393030373237303431323061386136366135323730663466636664313038366339323336393061333565376664343435653333616330336631333963363836383535363537306364633461616632323130376136633161343432343536613763366337396565303430393065376535643466363662636136306361316634376236646662353433646163336362663139613737313961386635356236663833623461336238613636643630323536643061343635353166613730323462643035363331623861353538303837373235346332663266323638636463333364326462626366623733336539666265323333626239636235396162333161303134386232336538633432363830666631306166346337396134643038333436666237396139336439363239353438656166316262313234363938666165666134636464373234343263303361303462373333343332663734383930336133323563323833643435366162396165393231616537656433333931653564313738376566646332333534306137623835633639316165383730613037663930623131633133623332636534336561656431356233363936383563653439313737636339383530323033303130303031281132060800100018143a60623064373630623735333936626438303239326366373531646334333833326130313432366663373965323934306161396432383339353235666664613164623034626434376434653265643362343630383833373338303035303463653133420a0a043427a2d810a48803420a0a0422524eff10a48803420a0a0422524eff10a38803420a0a043427a2d810a388034a36486f73746564206279204175737472616c69616e205061796d656e747320506c7573207c205379646e65792c204175737472616c69615080e4fbd8818da49f010a940822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303038643435633231633063393565663635613032396435326339353766643066383566323031323364613033346536313637316464656535343735663037333832613636633636636234646335303530346464666433373538313038336466386431373537373330656438643666333634646634633336613236353135393139353564613230316132343037666138616239623233313338313132323561306461323330666265333830653039306161353665666134663230326563396234383233663635303164393661633639386562663236616163663365653264316633326137323163393437653130373663663335623337336461316438376133366131353265303065373130313137393232383265383235666631373163353833336238383537306266633664613834343965366639356638623132363561623535353139343033313535336431643537366639336334326330636136306161626163346338646431363264383131346632623231353131353833633732353339666535366334393961393239646533613430613064343563313763353839633264373938386365323665616663393261336433376237656130303432643433653033616661363237316232363235356136636363666165353337313832316438316530623035633235306235396630613930373431613065306538386130396564353663356239373830643039356630393036663062383164353132363339383261616530313133366330373264383434613131643664613462326136316336343465316162313766313666663438656532336665646538343532663165343265326433306130373930633235643432303630653164343461363731613265623233643131346636386337316533336631373664623538613638623433303035346263316432393833613233613332656136666639356661376334643865333830656232393665393862373936386563663834353464383137633733376565613564643932316562383663313663376232393330346134613765636265356133613130323033303130303031281232060800100018153a60633332623830343033666562653331633462613165623436636661393363626339313639663238353937613330636130313336356362336531373936373261373535613338343530636536616161626634306164396533363034386664386434420a0a04224c8c6d10a48803420a0a040d247bd110a48803420a0a040d247bd110a38803420a0a04224c8c6d10a388034a1d486f7374656420627920454446207c2050617269732c204672616e63655080c486f5f9e69ccf010a9b0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303062303561626532616230306664643036633935356538363731306230653036663161393236323461343861643163626338646663366632323132393632623063333066646264323834613337633561333736353862363363333665613831363235363161386534663934366362653537323263303238383031663066323831633730663864383863376330306132663265323966353937623739393836396564383335366466353763343762653939343461326161666636353066396234626261306462633533646338383066646262363965613435313930356432383032323032663865323963303461373664323761663265623763353438343835626633663436393463393063343138313038383838343337393238343838333566373831363730376433653864373666346536376635373830626366303838313363353565633633396139626436323431373866356562313437643530306166333531653965663162316533343234383463613236306462376363626165343836663133636632363562356231616236383830363630303830353362323063336465646365373731633961303861303332306161396365343531656239643938336137623439636161313039366638616463303938333138646333386530653763656630643865356435353761303637353638356131633965323536613262633964626133323262336262333137326366373134303737626333383066386130613433336138626661376662666335396636623039336563386266366539333937633039623138653138303430633162353636383634373337633866613765323937393566336134353838646461376332626162343935363635636334613962383336653265623930633632613366636166353931666235663831383034633736313830653632366661323634346137646533343531316436633436363764393839333765323737333366346431653931333838333335346535346664373335313732316537366637623536633334383333383866346136623837623238616562656230323033303130303031281332060800100018163a60373364383962353366376363316563363734616632386164353231666166303864376130313831363634363965666338343531353461633431313038613964383132396138383330303331613139613537353161326437396362633437353230420a0a04344eca2210a38803420a0a0422408da610a48803420a0a0422408da610a38803420a0a04344eca2210a488034a24486f7374656420666f72205368696e68616e2042616e6b207c204c6f6e646f6e2c20554b5080b8bad5e281a599010ab70822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039386564366232323133613364613839346238653833633435333235383930393764316639343536633730623966653264386333303864656633366461613837373036643433306632336361353362323764303334646566663563326530616333353161303732396234373630613139623135323562396432306131393631623936323235356334626232613563633035613035643762343736663665356230353437623461383833623530663764316339333734356261343033363636303831303664626630356237353565626335316431623832393164313037663563306439613234383365626365336430376338623762353835376436326234626535363337356366323331346637653030396534663139653863383038396563363966393664303236363139396366376561333336336231353761653935326232323833613864396637636562343537333862313532343836663534643430663632303062376561373535643333366531633333616435386666653033613863353635306162363262393362326236363435373639666530316634643231636661613463653939353130663737316465323262613961643165386335656364333430346363333138333137346337633834666264663130386234393733333836386537633966656362393062336262383562306333633133373830333266336237393865366662396637666433356664323566336332316537636661653831613031626261353062633466646638323232326131363836653932303061316233323362363138653434383939306532616566623330363139303438626533353939666663383838306564653362363765636338626264346466363433326635323162666233333762663262303935386532396536363232336165333564633039343036626530323132313332626532393538313639346137343032363034663163653638396334623537613562616662633164343662333432623531633331666632623536373563366331646636306431323864346136346336366662346631383330323033303130303031281432060800100018173a60393033333838666533346538626438636165323865656334633665386664643230333562316463623563396634356233326234623137643635386336383862383164323333303638393536346333373164343737663638623464326233393539420a0a0445a7a9d010a48803420a0a0423e8f49110a48803420a0a0403125bb010a48803420a0a0445a7a9d010a38803420a0a0423e8f49110a38803420a0a0403125bb010a388034a28486f7374656420627920436861696e6c696e6b204c616273207c204d6963686967616e2c205553415080b4f6ca85e0a787010a910822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039646364386330613533653930633335353935373466363632303431313764336235303365353061333664333039376661633834323965366365636433376262353430373138303866326565393832303335663835316130633962653231373633383361323265333863316162613136386633326639303537306362333233336366653632353938373636366166363762353134636165663231666238646636643066636433336366323630366239326464656135353336623630363864383637383265333962643563333834343539393164343139623764316563303835393934313263303934396431633234306233356331346463353532373464626137316666616539333631323561356638313966353431333265323433396434616335353937393936656365383565313364666633333631663931333166353663656163356239663535326234396366366639613961633665356463653264623336393436326639336166383065356235366236653862656661313632613036316234613736383932626463383436343733303663363030383538666464323730333237366332633730343430313938656664376665333534356366326162353830633734636664363434356161663762643766373435636332353265616264323635656162656538363234313731303465363934386135353735366664633232326466306131303135323464653163336330386363663034333031316563376665393634656464383435316131333031343763303733363361333566313166646565663866326132623736313735376234333538666638396237356134386436376264633630393036393365306262383637396563626239336666646233663365643936626563393365663436353665333731366162383763653436636138653132353963386665646465386632663165613066336562326334386539363535316465313233333033343537323566343565643639633835373562353136383361666134373236323138323664623232626232643163346631653336343634613930323033303130303031281532060800100018183a60343136663935626665653633666464343562666331303037636265633364353434666163366233303339666531643030333137616666346339633965363739313862323863343862646462323363346361313131333163643832363062336564420a0a042259672610a48803420a0a042259672610a38803420a0a04128707d310a38803420a0a04128707d310a488034a1a486f73746564206279204c5345207c204c6f6e646f6e2c20554b508088b5c7e6d4a881010a9e0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061653761663963363038633162646232383966623831376666633663393537376564366434663664353766323734623231356631333930633765373965343930663964636237346366666530653837353764363766393066346232306464343435316237666636363331613662343563396534303362653561363632323439353535383364316161343233386261366639343662373163636138633136636337383838623266306433333363363335623865353437386661633362613366383134353761316131366230346532623232353236353162366334363838633535313064326564633231623033653061396232383330343162656566363738336330303839383435656363393665366432333563353636383564323438663833393166653061666366386565303366336234393836393663366439646563663266633939306332313965663664326362626132613639613236353238653630303936333264383265616433613538336566306333376332623739303638313138653033323062396663623331386635616534386330383737393535643038333162633935323161616138386239333431396665643966343632663930306663343236303130353665323463653434396564626463383439626237383263303961316133366164356534643462356437343636623737363339313366373934623237373162303761666236313734343466623662346237343834643634653139316235313366633865323530313034336637323534323163643537623037336265643231623030333134313835643638383766626332623534386439306262326133633931383461653934346333323664623866333761373335366161383832626164346337393437613830653136643066303265333832643537373166313938376331623736653838636465316364663264316139323231356563363864396232303465383062356463343637356666336161626632323366373738376562323431356466356533383963666636306663343063613235323030306234373638343130323033303130303031281632060800100018193a60383835326362386463646461623336396535373139636462616335653566353030393866383832313736343132616437313165326230336163366539666537303335383236666434376331326131323734326432633030643530373537353366420a0a040de8f0cf10a48803420a0a04225d700710a38803420a0a040de8f0cf10a38803420a0a04225d700710a488034a27486f7374656420666f7220494954204d6164726173207c204e6577204a65727365792c2055534150808cf9d1c3f6a593010a940822cc06333038323031613233303064303630393261383634383836663730643031303130313035303030333832303138663030333038323031386130323832303138313030623732383031303538636365666235323133396261396336383638613934393565333762613635373163356263306662376632623064303739303035646435636531326166373035646663356163653766653462303131653634393765316230363565356566336439333735353362316337633130353435616335633931333534656366616436613634373634363838383363633636613461356562306531633164316262663130333064393635306636376230373539303965353336393665613331616361643532343031313166373535333762313465366565663634353164376233333464313830346132613537383962356534616336626661323739353565353531373835313630316236376366643062643238363963376564316634636530393865333637663133336231393538373433633133633666363930313161386334373562323132366433626333353233383739383963383636666532313961313632393165343461393264353437316636666331363836326563376266653063616435613465656131633630383239383736666235613031326531646263353163306330383264383930623936333532363764643939623463383131313538323665383136653232653333363833346339333033633533336532303263666136613139313339323630316365656462613366396361346465363131373737356530666336313034333431653733353231313339643736633333363464653238616635386631343733613038343732633630393136613634316165393764646239626230373238333264666535623932323731666434376566383963393832386130633731373534313864316339656133323032653262613538383133306262663265333834656238343763396163326436383037613932653462613133336435373135663336323636363137663864613536633963386233393462633030323537356361323032306364613966393239376137643034356432353130323538313735353965326561353266353434323833323865633364623331323731303230333031303030312817320608001000181a3a60343365393462613234626662376665613934393138663338383162653632353239393035623831353631613764626337636434646363306165623032626561323062383936393830333434633365376533356133323865623163353236343430420a0a040de4670e10a48803420a0a04225796ae10a38803420a0a040de4670e10a38803420a0a04225796ae10a488034a1d486f7374656420666f7220444253207c2047656f726769612c205553415080b4f6ca85e0a787010a9e0822cc06333038323031613233303064303630393261383634383836663730643031303130313035303030333832303138663030333038323031386130323832303138313030636137393562313636643833343362656437656531343663393535646432316238323865383330373862326136643331346236373736313066666437336562613239313138336136396235353865393363346530653663363861323533356231336161663631663961353665323930316637653162623939396665313738663463393335346634353666636435636338633938643235393032386166646432666231646636363632326433343361306435313331373637376665653165623734393136393333333461306636366238393636356265343061346165623337366163633061633032383363356635643330346231303330363936626664366330373330363366323166646665376239613263383339616266363337383238333033626632646561323864613031353932303435386639666439346561633632666431373465333765653038613433623739333062323232313461353636346465636138643334383239356530633339396161386238343630383231666236343464373730323432363765633934326564663264643063356461623237323634303433313333333838356634343265373363633139343134386637323863356137633962356132393636643365336232356639383336303066646130656133613462653937636637653866336230666236343866306233356661313364323732616537643433343261393239623539376234306431633534343433396361646332366462393962353435636165653630373431383838333133356539626631363066393737396635386430386435303266356562393531626631653130393137633830333961626466303961633336313465646534393838333966336461323736303031363834303534316665666338346163393363376566643931383532613434303136626664633638653338653530633361653363633534356333376438336130363734326161386165353331643562313662653332633662646630366463633233373330313338393266393265336165353336343164373663643261386464303230333031303030312818320608001000181b3a60396535316430316664323032663535303830653564646334633561393832323734376336366138353762306434303730666332306233663530386335613230323339383737613231396237363138323533343961663566333030313061383364420a0a04227dc86010a38803420a0a040d38046010a38803420a0a040d38046010a48803420a0a04227dc86010a488034a27486f7374656420666f7220536572766963654e6f77207c2057617368696e67746f6e2c205553415080b4f6ca85e0a787010a9a0822cc06333038323031613233303064303630393261383634383836663730643031303130313035303030333832303138663030333038323031386130323832303138313030396636363165316236353236626432333132333932383035353564623134613930393430346364636339313838363432623664343763623266336539633931363633326532366134353034636666303862613730643134366462333137613038636330383230303431396231623936393435393834633139636633386436316362346165366631316136616135303765616263313261373239313733313336333739303831366466336136356662396635356232303231383432396336643234636431393330326231326264623635396164366262383137316564366636386439653936646465316161306166343563363963336265633036316335363135643831363030626432626437313064383133356135303065333765623734386664323936663763353638633236633064636265366166653861326663326263336137653533303532346338333531323864373661613534623431336566613033353236396664363838313439376435616233303061623465666461343535663432613830656633396336626334313933316634366238393132393930343062366430663364653839336636383235346265303834316161653466353131323039376530396462386666633830633835323363373965613831633663316164656364303431313561663964626263626333356130326462653839646238386566663666666638636436623166333335656634666137323030303866613062326135623134303232313933656239653263623766303337326661396237653838313433386566373436306665313738306563363533663261336365373839633066356362366637623237313631343861326531636233656463316336646161316531306134633062383637343162316266633863346432663335636262306230626331346366666264363737353132666331356230646639336637366232326333323433376332373531633833323963646464386135366563613735323030373265663364303161636566633137626233386161346434343262623536643362303664303230333031303030312819320608001000181c3a60623032633965383566343964613138313437666431333533373733626166306537316437326532326130303766316466393035316161386134373631616538376164346639306561346333343039383131613163343737376363326663363166420a0a0423c6dc4b10a38803420a0a04128b2f0510a38803420a0a0423c6dc4b10a48803420a0a04128b2f0510a488034a23486f7374656420666f7220556269736f6674207c205175656265632c2043616e6164615080b4f6ca85e0a787010aab0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039623138393637633833383837376638356136343731636539663136346365663933396230313833306239656232326330326363366237326139303730323062336534633031346463373131656138653039356238386430623438353865633836623035613863336135396163313264326239666162636163323832636562363138646230306562353937313636313164363730366338316161333264396464646336613663376233393662613230326665646562333366323839613838373238346562666330376431363664303263326336656433326337333234633365633861653232313132383534653138616235656130376136313563356566383030346563363861633730646330333030336134376637656665313033656463653235376432386537393631663432386631636661326536636637316266343563353634623832636362646131346131383366333063326333643561376166626137613030343037396538373730326332343965393661376232666464353632666331363735396566653735616265366132336430643266393036613264663164346236346362323131376137333034343439633735333139613736323063323139613466666339383265383232623665316130376265316366393862653932363564303836646332373161613430363331306638613834366664333331323339666533303362643536313663383930383066623838363339623763306365623134303039333831383233653034333364623666393135366532626461313837336434616139613361363339363034626662643131613664643663653033623462306365656639353630316337643838613834303339376364626361336666323134666266353863396439646264373964333965613736376539616535663665616239666361303566633438303066353537363537633930633132633630653032313634383235643463333361663437333733373465613233356235303331336564306237356266383961366237393030316662613734636331333139653535313530323033303130303031281a320608001000181d3a60666666383030656134323830643632633963316666333333636634333031393465306638616632383262383133623435323131333238353333636637326639663134363434633036303461616366313262313635623561366230353961636333420a0a04364a3c7810a48803420a0a04228e478110a48803420a0a04505546c510a38803420a0a04505546c510a48803420a0a04364a3c7810a38803420a0a04228e478110a388034a1c486f7374656420627920616272646e207c204c6f6e646f6e2c20554b5080b4f6ca85e0a787010a980822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061313365303030633633343962366238303565663538643036363132303131303762373534366135396432626434653064373633333363333834653361333361393436366338366665373866356462383062616663616263313737636637633961626536326163343838336539363336393735633665393538393738353465613163643366623830376237653630626539656231663238356339306661643230366265366661303163613134636666313161326264616539366630303030386261616234343361353338373463323539336337366230613362646462346132306164353762326635666534343430353965383539316636623533626266393233393634333666306137333934323364613833346537346333666366663332663464363937343334303838636365653737373331373236343064636234393432326666363638613334333131663730373838343937616662643064636536316439653362366434623833643533623331663237616664356337366365373763396566383062643764666139323861373466316131643233393437663266313439373832366661366638383034346565313731383538383032313334643965326461653735623765333937616563336138323666383930643730306138613233393666656639363733663737616530363333333439343130643937353837343765613866663238373866613733616331646561373962376365363830663138666239623830383135613735626531323431336435366261643733303131366530656136653930333863326432343765663065663935623164643033663632623866316131333636353538383937653433323461643036616139336663643935313662363430343266376265343038373861633738653761396334303434376665333838373866383231386135326665363431333262333939333665363630333039623034643037646337323266633439356263396263653831333864306536326338366563353363376639636339393763336436636438613931353230313839656230323033303130303031281b320608001000181e3a60393737333639316332393935353531393332653035326537646338303533326233316438343730656332646233373935366365383830333638313739363534333633303066303064393562613561373530633262373839316338623636613961420a0a0422c9b1d410a48803420a0a0423eaf99610a48803420a0a0423eaf99610a38803420a0a0422c9b1d410a388034a21486f7374656420666f722044656c6c207c204e6577204a65727365792c205553415080b4f6ca85e0a787010abc0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039386538633539623263633133386236366333386562383137306435663364353561616462633037633835666639346338653965626631326139343736616535343665656339343665356161633436373539326661653263626433633362306366656562363833366537616237633137373830333661376532653161363763323765326661373135353532663232623837663632303662333135303938613938303238343061383735343030306330353165393465343033336465333762383437613165316236643863356163616365383164633763343935396239373530383634326264376333323032346662316364616437343535366238386435373765376133326535633437303362343931353161373163666237303130613134383433663239636463383936636361656632656532613631363931306632326464363566323164393961633335313532356130643234366330363666346566623962643461363430333165663164326663336638363461633863386638313462623365633030373539363937313034663362386231663364306161646536313363373438663834323264623630663566616139366637656439653636646438306439623664316564666464636164643739316365663036306533393330383261363166656130623066393936646435346532383766373562646530316536666364643832363938636362393065336565326532333539366138373036626464303466353666633934666334313730363131323835333631313064643963353832356537326565396335326135376233333265646636656231666566316433343235666465646164343031626462386339653261303730363738376365373863303061373430303733393834326230336335376234383331656636363133353164363238326534613666326332343861376266303533643664393439363635613638323039313436356134643064663432643831663534343837346631373439373664613731373034376566363036636538333234306366353436666666623761363930323033303130303031281c320608001000181f3a60663733313362633038623964346263373934636231343034643166343832613733616335666530633032393362356337333634376465333834316230353931303636363234653939323231373264353432313262316239653661373930393038420a0a04d94c39a510a48803420a0a04226b4eb310a48803420a0a04034d5efe10a38803420a0a04034d5efe10a48803420a0a04d94c39a510a38803420a0a04226b4eb310a388034a2d486f7374656420627920434f46524120486f6c64696e6773207c204672616e6b667572742c204765726d616e795080b4f6ca85e0a787010a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063376630636364316436313465336236626139373536663766393438323030613134636235336639633333343862373431653364643064323332643135313362656231666236393531653338376264356266643935656433653961303166343930363631363330613061646437386131336131613232396533633630623238653830366639346465373266653435373634333132313566306664633161643937663830386336646133653961306164633431353937336563343862383935363634636434353261663230646161633432333232623037656433356136316362323730306364623639386131343865636662633635373935363039303433363661353534346639363563653530666539383234366664366466323537353938396564633631383565633339616432326239353233666231643261313136393430646136306164633064353564303033313565666665323130643162666235623535366230313561383335633132386434613333643566363933386363623733633165663266313230653662663030393737663765346562333137346134373434653232313561643438373337613039366264333965333266643939643533306365343261376261653535616265373362376430613338656639643062346139666432373532336236633864306461666537313631613264323864653832626362373464373531636236633238333431373638633065653036356134383136393633376239323466613463363763393164623434636166353735333838393034626464336465343062643364323935356261633135616361623937636163373335626134653764303436353433376434623732393464653430333234373431663763356634333334383962356330653538353263363535353038653135363539343530323666373363343039666162353865336163343662386637363636643534353630393534643538613465383765653562343233353463393135653332373361666662633161626461626534323565616539623739343630626437633462663330323033303130303031281d32060800100018203a60353636626538323639636636623133393964636138323038386436303735356430656463303561316231663438663366623664626233306338343235663335313462613563613062653363353436643131393930353836363138663366363635420a0a042256ba9710a38803420a0a04031451e610a48803420a0a042256ba9710a48803420a0a04031451e610a388034a22486f7374656420666f722048697461636869207c2056697267696e69612c205553415080b4f6ca85e0a787010abc0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303062646339343462333836373836343062653631653165653835303062303734343764313264633762313663353762636261363362633134666638386534376433363938383765303739343939373331333563386438633562363531353561613064303830653832396333663231613037633237343665333831363365663863366237313433313831306362323865616138643735646238343035356163663962353663393663386234376335313632633661613638616639653164623638336434363337333839643963383835383064383637336338663933303562363764326236356562316135626431316535376239333065396534663235653566633431376362646133346433323164326636646137663930393765326539653364623834313435653038633638323563633133633538356436393436363230633566336165353461356562393666616230323338313536623135386332613631643435313138306137343865666362343764306632323264376338393563333735656233636563616562313165343966653337383139623939666536373533623463643831383939353038653830666531306666353435346231663364643864376236613033633232653664333034613862343366653033636338386237613836323439656564343362363238386562336239356531383131663430356362333963386333336332303865643638656239613530333937333032313330636133393735656564393937363762663964623664373630323936323463336531303462363566646237323733336532393436386533323964373063623162323536316261633436643264656261393035333963663834623662616162313735303634643036633730623939376231313035363039663038613333323136336536313939613762303432303433623664383334623164306666663438643837633639313730616162313864386435363435323766356362363836356136386163356135633633313064376531666630376437646363343339663839356335666661646463626430323033303130303031281e32060800100018213a60336533313735656138616132656337353562643334363237353331376566626633363330666666663331633665623038633763393131643464323438333435313866643862636434373463663963663532323562346332363664346630653065420a0a041288411610a48803420a0a04228eace410a38803420a0a041288411610a38803420a0a04228eace410a488034a45486f7374656420666f72204d6f6e64656cc4937a20496e7465726e6174696f6e616c207c2053696e6761706f72652c2052657075626c6963206f662053696e6761706f72655080b4f6ca85e0a787010a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303065306563336265386535646230626330316536383832353138633265623536373366336532613131353666353436383662633839613934333334363836336534373938366162613766333537366264343738323063356565616564633332383438343736646533333365396339383435373733383230373934303036366632643534653864343165393032373932333364633363656266303735303866616262363836393261663566316334363737333462356131313866393534313361353263383939313561363939663339643266396330376665623930346331366537393635633337666165303237653733363435376565333531336263656631613662333034343261333130663233356361373331366536316135336263393166333131373862383530386164383661333737366365383262373565353032353038636239313435353839646632653365346237323663373961386532326533396438323432626233353662656264326339363636666430653433396636383031363134663632313363373139646562366539353966646166393632316365373936373862306533656166303361626465663261633663646535613837353238643731653639363031656331373330393136663138643864346132386566373464313134323562656362626661353439313166323632333933316532303337623664396131303662343762633630633961363239366563383537653035383264613063393739663931373337646363303239616635626265333464653663323363373962333237613639663532653337633661353862616130653438376463653634323163616535343066363230393766356631323232653461373065323638353935353237363032616634313361353764383864363765373461636262326432383631323633613335396133343632333936346633346566646261363733323566333133336339613064356632306333303961653237616131623765633866376539383133363433663338306163336264663164636332363435646262613433646630323033303130303031281f32060800100018223a60656164643732666366363066616233343232386337323961366432353834616436353432633265346537383561333531643331656338333235306434383264343064656136313737666364626364366530316163623365383063396230636138420a0a04239bd45a10a38803420a0a0422108bf810a38803420a0a04239bd45a10a48803420a0a0422108bf810a488034a22486f7374656420666f7220426974476f207c2043616c69666f726e69612c205553415080b4f6ca85e0a78701"; + "0a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039303938383635646566326632616233373663376630663733386331643837613237616330316166643030383632306333356362366562666362623063333330303331393361333838633334366433303233313732373031323139336262373666643330303462383634333132633638396566353231336362623930313130313530396465616239346632366137333265363337393239646134633463623332353137653361646262333831316435306163346337376331666365386236353136303632313566333437303766336537323635353435653538633839343630396532383337366264623737373566653330343339653065313539326664636230633365653163333035373733643037326136623839353765616663653161313162653936356564616666333834333336366362366134346563323561383930313036653632343735363766373662353530666461343832626165633633303764363938656338383834316664363666323366323130653437623861396463626136626134653166613731366462333363383065333038313934393664636235653536303966623665376336313533373962646465643432376539323331623932353463326261663934333630386138366436393861653961336338363339646638383764366636623561373133383564323433333864393131613231326266373166316532616363386231383662393665633865363963383662366430353832313737373661303963396336383935336564623539313635373862356132363362326634363965336230633037656164613731613434376565613766386663316262383037343235353536376237663062643165366166623033353837313863393862343239653234623232393835393666633736636636616633393663613934333464373932366563376433376434623932616635366434356665666638313936303935323234613931366331666665366236363765323535666333616338636363656639323064633034346232353030333133326238373830363734326630323033303130303031280032060800100018033a60333432343464353061386564346434636261646632353632306431616238386133323038313937376432663864373062613832626135326233333035613435363038323463663662303130366436333565643563333932373266666661626538420a0a0423edc8b410a48803420a0a0422ef520610a38803420a0a0423edc8b410a38803420a0a0422ef520610a488034a22486f7374656420666f72204c47207c2053656f756c2c20536f757468204b6f72656150b6fbd796f3968ada010a940822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039313331616133363866393334353232396639376236323539636363616666656132336530306364356561643032653366363936633165373134656533393339646164383630653338626639356132393734663965623438653933343366386161633430356561393535643035333233653131376233623163393438313361336166343266653830383263336434336261663162643464383336376539336462303061643639366536323761313033366165353334663031316561643565353666333761366666653434623662396530393934303131393261643536306130333436623431613831303039356635663264376664333264366565623635356261373538633662353236633132393338366166373139376337613533616536303364363232383332323534393631663136643065666138303739613736383536313838386265373333343932323137393536626263616661656262363133356335666262323438346435623461356664663033333661633032653236633136353263316264386561663330646165316436643365623030663762346661623864363437386665386439356562393131646639363661306465613465353232646237366238393636353730656363356166303935313634323466306166356638656536366533383664353635303731333939373136396163333735373362663532666430353864653935616232666636386536383131316162323334303565613936346232626238386430326330663163616564373165636464346534653430383539343837366664623835303062633535633762613032303636653035616239386439663765303436366439373032656235376565333732326638666363383561373535303566663332363231373032383862373838373233616462393765346465353632306363393065616431333832666364373537313838396665666231316536373731626333663666336665623139633761633534323837386430336139303237303532366333656564323439346566663534653135336361396636383930323033303130303031280132060800100018043a60303164313733373533383130633061616537393462613732643534343363323932653966663936326230313034363232306464393966353831363432323639366530353639633937376532663136396531653536383861666338663461613136420a0a0423babff710a38803420a0a04038234ec10a48803420a0a0423babff710a48803420a0a04038234ec10a388034a1d486f7374656420627920537769726c6473207c20496f77612c205553415080c09e91c191c795020adb0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303062326363616336356164306663373634356138313762666162633438376164376534313331316537613331393862333766623834326438346333393562336636376436626438343866313063366630336332393065386637646161386430303161383434316463333532613139313630613331393365363862383265646631396165363736393361396133336434636238376537383961313037303731353531356561373732636161386238366135363962393163353435303833356439633335346630646163656339376665373730393162343562313437363938623766383630313432326463643232363165393238646534646163396334326463626166646639366330373233336261333032373037366633376339363965386564333062366235643866353033346265376439326335393666386265383631653531666363336132343262663964386265396532613965386530663135356562636666323365666661376364353763313035343238313164383037373663393538353532366664623065616133346565313935356435313131393339306665383733653463303464656464323931363538383462393862343633303837383861653766633464346161346138666339626332363734626133323134393362363234343535616434313063316465373162633935643164393166613066323031343138613739356533303965616632393762363939626632376339666132373633636435396365623032316531366238323030633130363066323831376664383363666337363731383334383934363165333539393239316233383064366539333962616134623139323332613661323732646465363531663830343666646333346462323736613737376436666232626563333235356232636332343462346166353636623130356633306336353036646461653065623364656464636639343762636239633630653030303938346633623461386336633465643462663930626331393332623766393464633361653662333630303038656239303230343066396230323033303130303031280232060800100018053a60653535633535393937356331633932383563353236326436633934323632323837653564353031633636613063373730663063396138386637323334653034333563353634336530333636346562396338636532643966393464653731376563420a0a04176fbafa10a38803420a0a04176fbafa10a48803420a0a0423c0021910a48803420a0a04031212fe10a38803420a0a0423c0021910a38803420a0a046b9b406210a38803420a0a044a32752310a38803420a0a046b9b406210a48803420a0a04031212fe10a48803420a0a044a32752310a488034a1c486f7374656420627920464953207c20466c6f726964612c2055534150a4a2fcd0daaae18c010a980822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061336533376237366336636435663636323264363932343434346431326336373763333935663262353930326633626239386238613862353035356137303737303663613032386364373530363061326438373032643264386230343934376264636665306138633134316161323834346231653036653636313930303132653862363332366162306661333137393733626337636234643239343966323130386161303463346230633931626161353732386635623536323265633735616266353738613166376234316564653261363765626436396331386535383166646639633630323061633064653963613263333166306336343639303033333131666262356365376462343963373837653161376432376161343235656537623834646137653636393339663963383064306538326663653535653032646663386235633738343138613236616134333635303639383731396261666365636630626434393030306164646366613430353730386264626566626231393734396432326461623030376534346434356561323362313036663838333463313532653235303632643463663234666632353335366337656233373239313035333933666234396261623930346130326630663062623431376364393139643335323839303132386536626266663466616339663930646531313861393734663261366464303165303332613739623137386636306661316663626264303262353730346662343632393563313531393038313633373365646436363335633835363937386631623935303366316637336234623062653861626132656431666565616435393935336266383265666465393361333437316162643535636461336261386136373366626233373939373439666230303664303033663065363366363635633334363164326137623239646338623230346261353961363536363861343661653238373866303064316639343930646639653238306665626634333135656130346561613536386133613966643438633632633633623665636461363930323033303130303031280332060800100018063a60623837303764643839313632316231306663653032626436656132383737333435366630303862303662396461393835616532646131616436366265383233376366383331666335623862346665613534353935313739653937333564356432420a0a0423c7a16c10a48803420a0a040d346cf310a38803420a0a040d346cf310a48803420a0a0423c7a16c10a388034a29486f7374656420666f7220576970726f207c20416d7374657264616d2c204e65746865726c616e647350000a9d0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063343536316533633237386364363530653830633431336361343434323363316333633133636631343735663666363937366435393761653433326234396162343230383662373962383431333236303534623862336463663537643866636437396266633035383138336361323463643463316362633537346564313131376532663562376233633633636537623036643962346566636637333735363337623431666536663533633831316239646536313433663361353239353763646639353637373531323062333337303366663537363231343037616239353735626332643335633064343466303938336663316566363361346666353230396630373063393261663130363239353630316339366263656430363465633139303139373031396336383131633463386464383063623466346163373166396164373665376163383934353666626634663031316639306162643264393035333665383233343635316636626566393237653364356438623762663435393035303938336265636133616265663261396439376166333435373732613737343065393639393237356230313865613064663238366164643663653932336566393038666265373632613735663231313136383632646234346433646361316434346234643265386463313036366335303036626235613764393534616432353564346236303332373334373565353131616562343835643036396130363763306162356332343533386339333363303662356136616566613934303035633239313532313365346363646165366339343266363237326639646435323832643662383930663166323065666432333939636436373439323466613537303436616336646133326537333935316137333131336539316663326237666632396534383531623833666633396638336261396563366630386365666462623663626262666661626664666161393164393330663732303064613438313337633339346362643133653730316563646332363136666432316261643638316161346630303130323033303130303031280432060800100018073a60623863336339613161363430336161353536633462393663383936343339323563393831643565383364323963616665643739303832653331306531656234663135623536396337396664626332343136306238393165633732316663613337420a0a040372360410a38803420a0a0423cb52f010a38803420a0a040372360410a48803420a0a0423cb52f010a488034a26486f7374656420666f72204e6f6d757261207c2056696c6e6975732c204c69746875616e696150a4a2fcd0daaae18c010a9b0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061316334303737313534333033636337326334666237363932633366393432353162646563313233396131663761383937326162653931613335333233666265636136323561376666616536343036633835356463326166323131303930306230646630653665366462373633363464666131666665383565646135363739333665323938356238353633346133326161353261363539396464366333306265316637613663356238663565656361663236323164386134353936383266636432646261616431353631643131663333666363623766353530306163353638643136356462656161636533323836643238393466363431323964373831643663373266643764353939633965316433616634616134333363323362393130666165346334383431363431663631353236616437383765626561353339383734313637653964336137336363306662313536343239643135656337363361366430663036313135613739623961663738336437376239386438333039366161343734336639373430386439653134626366346464666665343539313736383834376234306362386461376361333735323536643262393335643039356665323532666165383166663665333766383464376139306437653537306134663865663363376437363665656461343732663039323031393930313561383930383235396138373363353435346663626264636164326535323864653835343535623430383363376463346164633561393838653063646466646331353964356437313261626435343461613733656330323930383938313463393861343466323666633036343436353963313833653331383461613237326638643164633062666133653061353630343834636230353562613464626235636333333965633830626431316436343264633361373032653863373033616232313933303834643962643633663064666531326134333363323537366561663738316366616438363765663730626461363137363862326265663134663530633663336238623039366630323033303130303031280532060800100018083a60346134346462616664353064636539653139616536353935656663663237626164666537396462383866306532393163333262303363306666633936383330623339316331343331313436313132353566356137366534613333626130333139420a0a0423b7429610a38803420a0a0423ec05db10a48803420a0a0423ec05db10a38803420a0a0423b7429610a488034a24486f7374656420627920476f6f676c65207c2048656c73696e6b692c2046696e6c616e6450c9f4d0fd84f190d4010aa10822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039336132313563633461376137323263616539633133616264363336646639396363656563366166396462343662363966613531363731366566353063653234393061393831653039616230313963613263623436383131623562363139643162643164356565366634366134326337373763626465653634326131343834656364663564646433373239363432633338633664343361383835383837343437356635383234343433363634633034646665643962383930343566623038356532356333656663623438343137333365666637633532396331333965363933353063326364373962326338643139363739613731326534653863616664333236373534316238333262336531306130313235356465663639646631653964336238643865616630333131646536376435653132623236646430316462626439643365343264333564396465323731333032653066316636396438376362633761636139653838363765396434323864336361623036363665623439306435666261623330626666336637383564303366323037326134336262396235653534363536613539326362363165616664356135656632383463376361656336366637663437333235636330643463316432376636363164386137343863613530373163303665663133346466663936663430383636383833363664343638613234373830303137653062353661626137666162343362336237633062373739303666616535343832663332383131633239326536623134343534653134623839343830316138366130336363343737393464643064373435323761373265343234656433616661303438393965636239613633663261396165373262653766613938396164663064363561333263383531643938303166633431303438646633333536346663376233313730376563386662383031343066653762376131666131323062613163623636303332346365666662346263633264396262376465306366353463383139663264643362636561646563396332356635653139646339623130323033303130303031280632060800100018093a60393238316639613166303537653964653636666163343433326362313362313032643930643563633565613738373438376637313430336362363261613830393937366636356363336235656461333861316333336137313962343662333033420a0a0423b59efa10a38803420a0a0423c5c0e110a38803420a0a0423b59efa10a48803420a0a0423c5c0e110a488034a2a486f73746564206279205a61696e2047726f7570207c204b757761697420436974792c204b757761697450a4a2fcd0daaae18c010ab90822cc06333038323031613233303064303630393261383634383836663730643031303130313035303030333832303138663030333038323031386130323832303138313030633537656462396666323736653032336232383032316362316438376364663139363662363938636634386534656161613763363932303737636565653863636232333961346339323135393765386538396637636330356433663331333135373839373663346533313434303564346134653033613732343130633563303963613532376164356138356239393836333765373261333265316662633064353534366232343635653965383036633264643530396562303530616235666232373036336664393238313562316464323638396532313131636165623666353439653934613966303066303832316434636136633661363131376635613533336339323633626630373461333064356362656635306431633863323338376263613937326564656461303938336235643061366235376463623030323030303638323862343065343037366234383730623234626164383430353665653532623566343232653838343030323863323530303633383264386539633636313232356634663736656137326533343036303765396663366633633230343333303736613163613863623135656430336163383936366430353037626364653638316534653032333165653966383764313131653762343861633866393464326438343262353264663733663537336363353431343936343739376336323639363866666165373431386633623631303962356130663039653332323366346134643565333530396464323530313338663662633137626636636563653137353934343330646631383061333865393061646632616666626661643063366238633162383766313738613036316463666266663862393263393136366438373463316666356166346662636462666538653964303939333730646466363062653734373633336433366565346562356364353166366533633333396531353165343162646235613563653263386339376130613433623363643463633038313838346338373966396432663337343834323863383537336631376339306633636264303230333031303030312807320608001000180a3a60373462636363393430333338393661613435393435343538623838336239383134336633643236313032316264653834373637356335633762306430663639313664656664636438386632303739303836613231663664363335343730393165420a0a04b19a3eea10a38803420a0a0403f81b3010a38803420a0a0423f2e99a10a48803420a0a0403f81b3010a48803420a0a0423f2e99a10a38803420a0a04b19a3eea10a488034a2a486f7374656420666f72204d6167616c75207c204e61616c6477696a6b2c204e65746865726c616e647350c9f4d0fd84f190d4010a990822cc06333038323031613233303064303630393261383634383836663730643031303130313035303030333832303138663030333038323031386130323832303138313030396264643865383466616461613335333266633463653031613861313764346333623233326635306139373930653236323638346564633438323365383135613162643562323065636561376266353665323966366262376238333166623362663665666364313437356630623865643566666230623133383562393664313636623632396630333936613866656635663036653462636132356565346131333430656532363361346439626230323064386634373233303666336438383631333864653761303139653035396264306166633930326363626131613231336165326461613630633861303133373535666530613438653033346635623430323361326461646561613838633534383638333533616337613761336466313262326662363431383737346539623134626536656162386363323762383830313261643631363264613734653065656231363133353930356634333733373464616238353836643735306132366262643361633234616564383738633464353365363531303732633837316539346437616363353735633936373338313733346135336665616634643762613662636464323431636336343538633630383764383633303261613235316330346636643536623963333264376439363632343735306564303535373835643037373366343364633039396232386339323238313134386536633831663239376666396431363665303030616330346233313234313836373735666365663735663565626130633130333262663133306466366364376134363231316430646633653035383464393265613637333439643834393035303865623465663838663534633863336434383664653837313966313066613936666562383563633739363037366361373831333138656532643965643930336361313333363034306335396164393161346432663639386539313038616530656462396231636239356164333362313937666662313862643162613862353663626565326161653935383565636532303861316531346234383536343633303230333031303030312808320608001000180b3a60373033316631353431646264376236666537646137303234303236353832306433376637633532396139333334386635306437383432316231383739376537623135636465376430653566303537633838346238376430393365376433386635420a0a0423f0766010a48803420a0a040d3577b910a38803420a0a0423f0766010a38803420a0a040d3577b910a488034a22486f7374656420627920426f65696e67207c2057617368696e67746f6e2c2055534150a4a2fcd0daaae18c010a9e0822cc06333038323031613233303064303630393261383634383836663730643031303130313035303030333832303138663030333038323031386130323832303138313030393032353966346533643966306633393432353635343865396337333038623130623733343033636339303934643937616431353162373730363137306239373732636562363464363632656365663930316138643764313564333139613539633862373130373161636364383935623763393336313064633639373666363763346531373239626138333733616237653532613366336338663236353439316464653639643665303939393437306537343435393831313331626439366333366536383635323033666232656264356435306561646166623732363339366465633164393137343839386234653962653034633734643330346665616464396362643332333463336237663333303663393963623063333339666332353936396234316435386132623763666331383332653232366438316331393633393933653232353561303837643136393863303364343231306264363435383036343464303935636137366161313739346564643430633163383762356638326138653339663630336539373131366261303435373865376538303334363439356437383564346566376366373731346239656236663566396530623961393466346237333838343631396239323734643461393565663135373534613839643937656635633161383862366436393365306138306562643533376663396366306361393164316336326439313564653765643831386239353265363463323030323933656538653238346134313661373261336531326663376434323362313538663962343936363063626332343636666265643066656432653234653130326664653934326562346366643934626563343664336439306663303863333966656362613033653063613234363461653636346239373935313562613239653166373032633366653730326265373933373936643865646231376161343863303932393062303234353439663036313166356165323365643765313634343264663764316461643232383663326262303964353532326464336564363938633266303230333031303030312809320608001000180c3a60323030636462653835346639383561613664366264313539613234613033346561626539306438333861383438306638666230653665393265623563353762653265636265353461333263373161653466393731653363333666326637306339420a0a0423b1a2b410a48803420a0a0423cc562010a48803420a0a0423b1a2b410a38803420a0a0423cc562010a388034a27486f7374656420627920444c41205069706572207c2048656c73696e6b692c2046696e6c616e6450dbbd98b593c2c6a4010aa30822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303038326465373330363566333466666332393334306435393439643232323062316534333636656435636637633665626436313663663934313661353365613030313766366262313136626664336633646566636331356237613464646630653434643032666536393536383830353365373961373730653230316263663731393333393030333965653866303836643466613734366337653035363931383330316639623565383465333932363238323830383561373962333232626361306235643835666539373232316132366262646532353863363230663064636561303261623165646431366363343961336632616239323838653364643166333764633462366136663731333366663932653534316337316237306432613266363664353537323561623138626638366430303965633364323466356431326530623565363830326431313531333732643462373634656265636234616638326636343934383565633537623561303164633637393538663561303363636161623763626139333534613137333732633133313662613437633935336161663934393031623366386332346536613361666436373538653766336231343363653264643363623037316232613734633932316365653934396134623561366265383739663163373930613662386436336231393264376565323961393439316664643638396139386330613763336436303332306631623461633264363232396466643934653432663361363034386137366265316562393538633861313837336265386433333861656339666335396162376633373632363738393430326331666435393566313930383735373565306265383237666334633061346662336433393361643734613934396363393836626662363463616264646165353339333566366463353630373464623933643737656133623831366264643662653533343439373237323238393835396666333463653531383630616666623632316431303438376463333834336631663836643534303334613633653438613161306430323033303130303031280a320608001000180d3a60303762373763653238346637656262356265623037623130353337356166353564323238613736356531613834353837656231643166316230363735633338613164313531323337306535366632316338656435656164656662333737396139420a0a0423ea846b10a38803420a0a0423ea846b10a48803420a0a0422d7c06810a48803420a0a0422d7c06810a388034a2c486f7374656420666f72205461746120436f6d6d756e69636174696f6e73207c204f7265676f6e2c2055534150b6cba6e7ef8db9b0010a900822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039383735356134303862353332316532363330353230303064366437643461326333613535346435653133383461396362356562663437346165383832633633623438366264303864313434646466316139346365396137643632353139363330303661666461616334353838343666313736343031393566653235333961363536393330656661383534663231343865363865633161303863316334396432303063336633303435666537313437663036643533346334626432363231303063623164643339373339643736306438316130626432306638336632353564323530376434636362313130366235333631386336613934343039633838376361653236326434636565396338363233323134376365633134303465306335376262613733313731333065653339363433383838616633643539386564643832623863363165363561653831613465316135366263303664333937313433613938643431636138376433656634333365663061656162363830313139316233653338343830393638663636623665383836363261663435613965323132393934663638623238386562393637626562393834373863323433653231333663316131353931663036316635626330346232316666326261343862323966313834333130383838373362646665393966386135326539343038393731383536653830346465613630326133313137383663393835363532393633633361333737303332396234303966373466646663373436623232613566383431383931323037316334636538343663396234623332306665646636653962363465326362653338346639613832623661616164346232303930373433316466316133336636393230376135363536303062653831303730643038333239303039393538353961343439386435623539333135626365626566656538303765623061336139343266316364663333363764643434343466646232393838366566636464306265346162653961313838383033393533383735656461333364623732393839663736336230323033303130303031280b320608001000180e3a60353061666134343861336137386236313566343966656635373762643762363262313330383265623535326366383839353130396530653534333866373961633861656432663261343865326635373034393037343666346334333931303462420a0a0423ec021b10a38803420a0a043408158d10a48803420a0a043408158d10a38803420a0a0423ec021b10a488034a1a486f737465642062792049424d207c2054657861732c2055534150ed86e0eca193fc740aa60822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061396462376638626161313236383938666162373839313135613362356438393734346631393765323830343161653039386633653838366336393837313732316531316262306164313166336365393132346161393631643661306463383435663439373635633366616231393935383430323637366635363434363262663238316462613535383837383066303365393035373938653138343236396161613630663761313437323333316532666231646561646438373763383463626362363431636139653563386164366534356263313539636230373966636230643434396364636438643932333963316130343765376234343864613063646361323636313061323566323936643936653734363962363736643461343434353136653761353965383532393361383038366638343063303532383534653032613863623230303264616433353832356265346438336235326661393165386337336666303439373436313438383632373837633131313866393234643331636261633162343466656666323264343336623339373965616466396234336134626661373265313562343735356663616232363065303661323739633362623733626337663136613036306434643532326664343930353830333838616135393564383034343733366535323266363432343931356637383033623735383365303935636466373863333235313936393764653831623839666235303035343735336231613137663961616662303634643834633939326639616231316363626338636231303831346463616635323634616134356632316264656661633832636361636161663335386533313337336565316261346537343032666438613730656130633238636135636337346463343235313063393639636432633435396231656333363838613031656133396139393237313063643232393763393861383462363334386135373738303466646332333464336665313930336532633231653137326461323862353961653665346337653865646438623731633439643730323033303130303031280c320608001000180f3a60633637313364383765336331663638353961336133363633656262316237653162643164613134666366303736636535316433363436346235363832613564663763666164643434303139373536346634393838343233313330393163326264420a0a0423e40b3510a38803420a0a040379ee1a10a38803420a0a0423e40b3510a48803420a0a040379ee1a10a488034a2f486f7374656420666f722044657574736368652054656c656b6f6d207c2048656c73696e6b692c2046696e6c616e6450c994ee9efedeee80010a910822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061386365616333363765623166316465356630643965663365616630646639623938343438666532303830383437363536326130363063353163323839373730623463616366653932636236353536393832336539363263326132633966656435336264333663613361313232646531633532356135383266323561346437643632386331613364356264623839333661656365373531306537353534656537303333303235633039326338323865656235373338626530326564393633646138316135393230353633346365393435343537376162383266343066313366316565353565306165373237653233633330323834623166343462393961636534646463356639616337616438386439666132323535393335623234646362613834303036343265313663663235333263306230643638393239303436303837313563343037366634366438346130653066656433366537366363646339363335356537613236313630393435633262353461653236636330306664303832333236333436656565656137646437356639313931316539396462636239396561346163366261303536633333323238643838316438353833316439636338373935393364613137343664643065653935646332623936666539336261666366663263643764393239353864373864663333663230356437313135656439666163346462366634636336306535366135343431646135623562353566613539393939303265393538613662366334346438313064646335363138313234316238376632326630353961363838306538303231373336643031383937646236353434396365383137613233373564303335353163623064653530376336303961306338303330656366346266646562323133633033646161373634613138323162373234333334663731663736386437616563623237373035326137303333373635663037323138303536633738663261383761663138333836643866363161356366636233663262613464643539393135663133643338363334643136393537353730323033303130303031280d32060800100018103a60613533633865623730626464383965646236626535666563353063666162633038313030326134373761663437386565666133353565613665653537326534616535306538343938386638656132633036386166613738393637623263616630420a0a04129ddfe610a38803420a0a04225bb5b710a38803420a0a04129ddfe610a48803420a0a04225bb5b710a488034a1a486f737465642062792055434c207c204c6f6e646f6e2c20554b50a4a2fcd0daaae18c010aa40822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061663062393134323537626637613436353563346135306430636164356530613165343538316564363632336630653837333066373936623866323963353831373862636363363933326331666333316633396566343462383264336334336233393837333733373366656362313239353232386130346664353061313466333634366438346665316634363763616562393864343633653239373565393935623864326531653339663362663661646463323561653335643635643032363038653033343535333739363665326162636534396238313462656164336331623735373137346165333063303062306334336539396238303439366237326433633133316631633665346663646130356632383131376566396532386334333033626534643863376530343264353862383363633132313934356132633635653739363263616139313835393338663337353764663763636139356366303262356533313934346133613631396130616333663165333462396230313364346332323463346631653730666439666433363938336566383661646535313833363263633833323263306637623631613961633735666238326537623836643638626330663039396130396131346361633561316438643338663961386137306363333766663563633362626432373432666664313436323535633137316536613137383038333237316463653066646536383165643439326362353962303739366432373031373538333864633539303831303765336136656133663961343036623364313133306363656333623437393165343962626332333136303362343661623264306639336434336265373561623961346437313065613934306532383561376231353362306361376364646565366439646365306164383335306334316439306332313562393538383531356166613061633333363561653037653831663362626233366264626561633462333162636231616134653832353635623937376639646164383564363236656566396161613965663864376533666230323033303130303031280e32060800100018113a60623562323865366635373234303733306364613830326335366535336238383337613764363364616239623362336162313536613034643965326536653234623637393063333861356664333335626536376139353162373762656563373438420a0a0412e8fb1310a38803420a0a042256d4f710a38803420a0a042256d4f710a48803420a0a0412e8fb1310a488034a2d486f7374656420666f722041766572792044656e6e69736f6e207c2050656e6e73796c76616e69612c2055534150a4a2fcd0daaae18c010ac40822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303038633037626533303561643630623930626132646162333962306565373736306531613232663835373532323534306437306230336233663965343837356133613239616230383038386631343466353765623235326534366261353933383564306536643432373031313764613061626331623362383036393463396135303538623836643631646661303665373136373039633838653866656163376333613065316432356663306165626636613866373666636239396638343566653138313436316361623638353862393763336134303237666233373132623134653663303738396465313764343137363435373765353131343137656231363236393265623037616531653733353532333565396262343339303437623663303136313337383265376464366636303464616134363734363631643533393631663436633366616136623765373637363264333733623562353432623739656139363365666266333361633638313938626232623636316366663637363931366566333732616434633236633231366334626334373837633834656333326431383464373763373531383663303963663364396639313433336361393835333131396261623331666136616432366634353365353936643962646563613638613537363962633866656537613533356438306338633666336566623164666232383861623661393739383534623763653833313234656330643130326166663934633362373466396333373839353863323565623933336464353363316538303561313836353464366439313836393930663635373034323966393630663334653862346637666439393732646362666539323430653037346461326433353561356637656639633161663632656635393832613831373435373862396331356334396563353636626461636233306363666365663039636466653730386164343837343234653963316265363533663965653736363065376439343263316566613564613238366531616464616230366139613333663964653934363739356230323033303130303031280f32060800100018123a60656239373639393565356432613964613639633434623036646633633239656363613565626135303038663035343037376330656538376230383831333331346334666439316563383334643362383638666237656537373934663463626562420a0a0412888fb010a48803420a0a048d5eafbb10a38803420a0a04225756f210a38803420a0a048d5eafbb10a48803420a0a0412888fb010a38803420a0a04225756f210a488034a35486f7374656420666f722044656e746f6e73207c2053696e6761706f72652c2052657075626c6963206f662053696e6761706f72655080b08a83b7f6d398010aac0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303062653137633939363437636563363561343434303762353335383536623363336261656635623534663536356166353862383435366261386337636535333564356163373263363163343463373662336335376338653836343834313633376265313061383363666533396330393234373664306462653464366364636463643732306133306235626665623531613031613138663538326334356636633836393933666366376466313832393335646531643836393036303434646366333531383639333564396264376565613739353233353262656262346566396165306637363631653730613432333761666139383939363638376361343866636663356230306433383037663035346265306661386333626661343235303338626536656632393531363466323266373362376538386339346561396265386161346633613234356338396239643166643531393266376135306239353862326566383130346233366631626638666432636662323863313432313830306331633437653465663938616631353030373063633664363964313765386562393266313861366161316136353236366134393532333864313033663866363935623537656366333733363530613035323030383734353732316265613831353632373936376338303736333635646638633463376137643464643866326333383530633138666261373165623630653665386466626431393665303533376664373062333434656362636335333064666338336461366665646634396435316139303431393530326261396437306364333566316366336330363934653233353466393036346664626635333565623233633237633061343364306237386331663836376336316439383639356438646566376263326131306262363637346332326636366161623061393138313364646632376364623835326335396566373965316239653161303735666136656532376137653337373464626634623236343635343237653664356162393166653766306633613731373834656361313832623530323033303130303031281032060800100018133a60643563653666343337386436643534373233393438366566643661373032613734666361396539363537323366306561343365656661333262653938313739353038633432313835666132333735306432306538633066316361316435363361420a0a0412a8043b10a38803420a0a042259578a10a48803420a0a0412a8043b10a48803420a0a042259578a10a388034a35486f7374656420666f72205374616e646172642042616e6b207c204a6f68616e6e6573627572672c20536f7574682041667269636150a4a2fcd0daaae18c010aad0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061356164326237363433613034633035356432663863643235313162313531333966633435353735363231333838653439633131396232663339386163613131306636313339366230633836366465353036333532326262383534303237336531336636643934636531653630343338663661666230306161613634363132663731343565396263653862633161353362393431393133616137366339663361323833336661643763663238356337616332643337663939663363326364623439646534643135316536313637383536346632383166353431343234623431666137633531623261393630323238336337643332656530306562383338646131356333386166633936653036316439376365646532323136356666316161393539663163343237356232643039386334303538366135353739666262336362393030373237303431323061386136366135323730663466636664313038366339323336393061333565376664343435653333616330336631333963363836383535363537306364633461616632323130376136633161343432343536613763366337396565303430393065376535643466363662636136306361316634376236646662353433646163336362663139613737313961386635356236663833623461336238613636643630323536643061343635353166613730323462643035363331623861353538303837373235346332663266323638636463333364326462626366623733336539666265323333626239636235396162333161303134386232336538633432363830666631306166346337396134643038333436666237396139336439363239353438656166316262313234363938666165666134636464373234343263303361303462373333343332663734383930336133323563323833643435366162396165393231616537656433333931653564313738376566646332333534306137623835633639316165383730613037663930623131633133623332636534336561656431356233363936383563653439313737636339383530323033303130303031281132060800100018143a60623064373630623735333936626438303239326366373531646334333833326130313432366663373965323934306161396432383339353235666664613164623034626434376434653265643362343630383833373338303035303463653133420a0a043427a2d810a48803420a0a0422524eff10a38803420a0a0422524eff10a48803420a0a043427a2d810a388034a36486f73746564206279204175737472616c69616e205061796d656e747320506c7573207c205379646e65792c204175737472616c696150dbbd98b593c2c6a4010a940822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303038643435633231633063393565663635613032396435326339353766643066383566323031323364613033346536313637316464656535343735663037333832613636633636636234646335303530346464666433373538313038336466386431373537373330656438643666333634646634633336613236353135393139353564613230316132343037666138616239623233313338313132323561306461323330666265333830653039306161353665666134663230326563396234383233663635303164393661633639386562663236616163663365653264316633326137323163393437653130373663663335623337336461316438376133366131353265303065373130313137393232383265383235666631373163353833336238383537306266633664613834343965366639356638623132363561623535353139343033313535336431643537366639336334326330636136306161626163346338646431363264383131346632623231353131353833633732353339666535366334393961393239646533613430613064343563313763353839633264373938386365323665616663393261336433376237656130303432643433653033616661363237316232363235356136636363666165353337313832316438316530623035633235306235396630613930373431613065306538386130396564353663356239373830643039356630393036663062383164353132363339383261616530313133366330373264383434613131643664613462326136316336343465316162313766313666663438656532336665646538343532663165343265326433306130373930633235643432303630653164343461363731613265623233643131346636386337316533336631373664623538613638623433303035346263316432393833613233613332656136666639356661376334643865333830656232393665393862373936386563663834353464383137633733376565613564643932316562383663313663376232393330346134613765636265356133613130323033303130303031281232060800100018153a60633332623830343033666562653331633462613165623436636661393363626339313639663238353937613330636130313336356362336531373936373261373535613338343530636536616161626634306164396533363034386664386434420a0a04224c8c6d10a48803420a0a040d247bd110a48803420a0a040d247bd110a38803420a0a04224c8c6d10a388034a1d486f7374656420627920454446207c2050617269732c204672616e636550c9f4d0fd84f190d4010a9b0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303062303561626532616230306664643036633935356538363731306230653036663161393236323461343861643163626338646663366632323132393632623063333066646264323834613337633561333736353862363363333665613831363235363161386534663934366362653537323263303238383031663066323831633730663864383863376330306132663265323966353937623739393836396564383335366466353763343762653939343461326161666636353066396234626261306462633533646338383066646262363965613435313930356432383032323032663865323963303461373664323761663265623763353438343835626633663436393463393063343138313038383838343337393238343838333566373831363730376433653864373666346536376635373830626366303838313363353565633633396139626436323431373866356562313437643530306166333531653965663162316533343234383463613236306462376363626165343836663133636632363562356231616236383830363630303830353362323063336465646365373731633961303861303332306161396365343531656239643938336137623439636161313039366638616463303938333138646333386530653763656630643865356435353761303637353638356131633965323536613262633964626133323262336262333137326366373134303737626333383066386130613433336138626661376662666335396636623039336563386266366539333937633039623138653138303430633162353636383634373337633866613765323937393566336134353838646461376332626162343935363635636334613962383336653265623930633632613366636166353931666235663831383034633736313830653632366661323634346137646533343531316436633436363764393839333765323737333366346431653931333838333335346535346664373335313732316537366637623536633334383333383866346136623837623238616562656230323033303130303031281332060800100018163a60373364383962353366376363316563363734616632386164353231666166303864376130313831363634363965666338343531353461633431313038613964383132396138383330303331613139613537353161326437396362633437353230420a0a04344eca2210a38803420a0a0422408da610a48803420a0a0422408da610a38803420a0a04344eca2210a488034a24486f7374656420666f72205368696e68616e2042616e6b207c204c6f6e646f6e2c20554b50edb6919ca59ccd9e010ab70822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039386564366232323133613364613839346238653833633435333235383930393764316639343536633730623966653264386333303864656633366461613837373036643433306632336361353362323764303334646566663563326530616333353161303732396234373630613139623135323562396432306131393631623936323235356334626232613563633035613035643762343736663665356230353437623461383833623530663764316339333734356261343033363636303831303664626630356237353565626335316431623832393164313037663563306439613234383365626365336430376338623762353835376436326234626535363337356366323331346637653030396534663139653863383038396563363966393664303236363139396366376561333336336231353761653935326232323833613864396637636562343537333862313532343836663534643430663632303062376561373535643333366531633333616435386666653033613863353635306162363262393362326236363435373639666530316634643231636661613463653939353130663737316465323262613961643165386335656364333430346363333138333137346337633834666264663130386234393733333836386537633966656362393062336262383562306333633133373830333266336237393865366662396637666433356664323566336332316537636661653831613031626261353062633466646638323232326131363836653932303061316233323362363138653434383939306532616566623330363139303438626533353939666663383838306564653362363765636338626264346466363433326635323162666233333762663262303935386532396536363232336165333564633039343036626530323132313332626532393538313639346137343032363034663163653638396334623537613562616662633164343662333432623531633331666632623536373563366331646636306431323864346136346336366662346631383330323033303130303031281432060800100018173a60393033333838666533346538626438636165323865656334633665386664643230333562316463623563396634356233326234623137643635386336383862383164323333303638393536346333373164343737663638623464326233393539420a0a0423e8f49110a48803420a0a0445a7a9d010a48803420a0a0445a7a9d010a38803420a0a0403125bb010a48803420a0a0403125bb010a38803420a0a0423e8f49110a388034a28486f7374656420627920436861696e6c696e6b204c616273207c204d6963686967616e2c2055534150a4a2fcd0daaae18c010a910822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039646364386330613533653930633335353935373466363632303431313764336235303365353061333664333039376661633834323965366365636433376262353430373138303866326565393832303335663835316130633962653231373633383361323265333863316162613136386633326639303537306362333233336366653632353938373636366166363762353134636165663231666238646636643066636433336366323630366239326464656135353336623630363864383637383265333962643563333834343539393164343139623764316563303835393934313263303934396431633234306233356331346463353532373464626137316666616539333631323561356638313966353431333265323433396434616335353937393936656365383565313364666633333631663931333166353663656163356239663535326234396366366639613961633665356463653264623336393436326639336166383065356235366236653862656661313632613036316234613736383932626463383436343733303663363030383538666464323730333237366332633730343430313938656664376665333534356366326162353830633734636664363434356161663762643766373435636332353265616264323635656162656538363234313731303465363934386135353735366664633232326466306131303135323464653163336330386363663034333031316563376665393634656464383435316131333031343763303733363361333566313166646565663866326132623736313735376234333538666638396237356134386436376264633630393036393365306262383637396563626239336666646233663365643936626563393365663436353665333731366162383763653436636138653132353963386665646465386632663165613066336562326334386539363535316465313233333033343537323566343565643639633835373562353136383361666134373236323138323664623232626232643163346631653336343634613930323033303130303031281532060800100018183a60343136663935626665653633666464343562666331303037636265633364353434666163366233303339666531643030333137616666346339633965363739313862323863343862646462323363346361313131333163643832363062336564420a0a04128707d310a48803420a0a042259672610a38803420a0a04128707d310a38803420a0a042259672610a488034a1a486f73746564206279204c5345207c204c6f6e646f6e2c20554b5092a983eac8d0da92010a9e0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061653761663963363038633162646232383966623831376666633663393537376564366434663664353766323734623231356631333930633765373965343930663964636237346366666530653837353764363766393066346232306464343435316237666636363331613662343563396534303362653561363632323439353535383364316161343233386261366639343662373163636138633136636337383838623266306433333363363335623865353437386661633362613366383134353761316131366230346532623232353236353162366334363838633535313064326564633231623033653061396232383330343162656566363738336330303839383435656363393665366432333563353636383564323438663833393166653061666366386565303366336234393836393663366439646563663266633939306332313965663664326362626132613639613236353238653630303936333264383265616433613538336566306333376332623739303638313138653033323062396663623331386635616534386330383737393535643038333162633935323161616138386239333431396665643966343632663930306663343236303130353665323463653434396564626463383439626237383263303961316133366164356534643462356437343636623737363339313366373934623237373162303761666236313734343466623662346237343834643634653139316235313366633865323530313034336637323534323163643537623037336265643231623030333134313835643638383766626332623534386439306262326133633931383461653934346333323664623866333761373335366161383832626164346337393437613830653136643066303265333832643537373166313938376331623736653838636465316364663264316139323231356563363864396232303465383062356463343637356666336161626632323366373738376562323431356466356533383963666636306663343063613235323030306234373638343130323033303130303031281632060800100018193a60383835326362386463646461623336396535373139636462616335653566353030393866383832313736343132616437313165326230336163366539666537303335383236666434376331326131323734326432633030643530373537353366420a0a04225d700710a38803420a0a040de8f0cf10a48803420a0a040de8f0cf10a38803420a0a04225d700710a488034a27486f7374656420666f7220494954204d6164726173207c204e6577204a65727365792c205553415080b08a83b7f6d398010a880822cc06333038323031613233303064303630393261383634383836663730643031303130313035303030333832303138663030333038323031386130323832303138313030623732383031303538636365666235323133396261396336383638613934393565333762613635373163356263306662376632623064303739303035646435636531326166373035646663356163653766653462303131653634393765316230363565356566336439333735353362316337633130353435616335633931333534656366616436613634373634363838383363633636613461356562306531633164316262663130333064393635306636376230373539303965353336393665613331616361643532343031313166373535333762313465366565663634353164376233333464313830346132613537383962356534616336626661323739353565353531373835313630316236376366643062643238363963376564316634636530393865333637663133336231393538373433633133633666363930313161386334373562323132366433626333353233383739383963383636666532313961313632393165343461393264353437316636666331363836326563376266653063616435613465656131633630383239383736666235613031326531646263353163306330383264383930623936333532363764643939623463383131313538323665383136653232653333363833346339333033633533336532303263666136613139313339323630316365656462613366396361346465363131373737356530666336313034333431653733353231313339643736633333363464653238616635386631343733613038343732633630393136613634316165393764646239626230373238333264666535623932323731666434376566383963393832386130633731373534313864316339656133323032653262613538383133306262663265333834656238343763396163326436383037613932653462613133336435373135663336323636363137663864613536633963386233393462633030323537356361323032306364613966393239376137643034356432353130323538313735353965326561353266353434323833323865633364623331323731303230333031303030312817320608001000181a3a60343365393462613234626662376665613934393138663338383162653632353239393035623831353631613764626337636434646363306165623032626561323062383936393830333434633365376533356133323865623163353236343430420a0a040de4670e10a48803420a0a04225796ae10a38803420a0a040de4670e10a38803420a0a04225796ae10a488034a19486f7374656420666f72207c2047656f726769612c2055534150000a9e0822cc06333038323031613233303064303630393261383634383836663730643031303130313035303030333832303138663030333038323031386130323832303138313030636137393562313636643833343362656437656531343663393535646432316238323865383330373862326136643331346236373736313066666437336562613239313138336136396235353865393363346530653663363861323533356231336161663631663961353665323930316637653162623939396665313738663463393335346634353666636435636338633938643235393032386166646432666231646636363632326433343361306435313331373637376665653165623734393136393333333461306636366238393636356265343061346165623337366163633061633032383363356635643330346231303330363936626664366330373330363366323166646665376239613263383339616266363337383238333033626632646561323864613031353932303435386639666439346561633632666431373465333765653038613433623739333062323232313461353636346465636138643334383239356530633339396161386238343630383231666236343464373730323432363765633934326564663264643063356461623237323634303433313333333838356634343265373363633139343134386637323863356137633962356132393636643365336232356639383336303066646130656133613462653937636637653866336230666236343866306233356661313364323732616537643433343261393239623539376234306431633534343433396361646332366462393962353435636165653630373431383838333133356539626631363066393737396635386430386435303266356562393531626631653130393137633830333961626466303961633336313465646534393838333966336461323736303031363834303534316665666338346163393363376566643931383532613434303136626664633638653338653530633361653363633534356333376438336130363734326161386165353331643562313662653332633662646630366463633233373330313338393266393265336165353336343164373663643261386464303230333031303030312818320608001000181b3a60396535316430316664323032663535303830653564646334633561393832323734376336366138353762306434303730666332306233663530386335613230323339383737613231396237363138323533343961663566333030313061383364420a0a04227dc86010a38803420a0a040d38046010a38803420a0a040d38046010a48803420a0a04227dc86010a488034a27486f7374656420666f7220536572766963654e6f77207c2057617368696e67746f6e2c2055534150a4a2fcd0daaae18c010a9a0822cc06333038323031613233303064303630393261383634383836663730643031303130313035303030333832303138663030333038323031386130323832303138313030396636363165316236353236626432333132333932383035353564623134613930393430346364636339313838363432623664343763623266336539633931363633326532366134353034636666303862613730643134366462333137613038636330383230303431396231623936393435393834633139636633386436316362346165366631316136616135303765616263313261373239313733313336333739303831366466336136356662396635356232303231383432396336643234636431393330326231326264623635396164366262383137316564366636386439653936646465316161306166343563363963336265633036316335363135643831363030626432626437313064383133356135303065333765623734386664323936663763353638633236633064636265366166653861326663326263336137653533303532346338333531323864373661613534623431336566613033353236396664363838313439376435616233303061623465666461343535663432613830656633396336626334313933316634366238393132393930343062366430663364653839336636383235346265303834316161653466353131323039376530396462386666633830633835323363373965613831633663316164656364303431313561663964626263626333356130326462653839646238386566663666666638636436623166333335656634666137323030303866613062326135623134303232313933656239653263623766303337326661396237653838313433386566373436306665313738306563363533663261336365373839633066356362366637623237313631343861326531636233656463316336646161316531306134633062383637343162316266633863346432663335636262306230626331346366666264363737353132666331356230646639336637366232326333323433376332373531633833323963646464386135366563613735323030373265663364303161636566633137626233386161346434343262623536643362303664303230333031303030312819320608001000181c3a60623032633965383566343964613138313437666431333533373733626166306537316437326532326130303766316466393035316161386134373631616538376164346639306561346333343039383131613163343737376363326663363166420a0a04128b2f0510a38803420a0a0423c6dc4b10a48803420a0a0423c6dc4b10a38803420a0a04128b2f0510a488034a23486f7374656420666f7220556269736f6674207c205175656265632c2043616e61646150a4a2fcd0daaae18c010aab0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039623138393637633833383837376638356136343731636539663136346365663933396230313833306239656232326330326363366237326139303730323062336534633031346463373131656138653039356238386430623438353865633836623035613863336135396163313264326239666162636163323832636562363138646230306562353937313636313164363730366338316161333264396464646336613663376233393662613230326665646562333366323839613838373238346562666330376431363664303263326336656433326337333234633365633861653232313132383534653138616235656130376136313563356566383030346563363861633730646330333030336134376637656665313033656463653235376432386537393631663432386631636661326536636637316266343563353634623832636362646131346131383366333063326333643561376166626137613030343037396538373730326332343965393661376232666464353632666331363735396566653735616265366132336430643266393036613264663164346236346362323131376137333034343439633735333139613736323063323139613466666339383265383232623665316130376265316366393862653932363564303836646332373161613430363331306638613834366664333331323339666533303362643536313663383930383066623838363339623763306365623134303039333831383233653034333364623666393135366532626461313837336434616139613361363339363034626662643131613664643663653033623462306365656639353630316337643838613834303339376364626361336666323134666266353863396439646264373964333965613736376539616535663665616239666361303566633438303066353537363537633930633132633630653032313634383235643463333361663437333733373465613233356235303331336564306237356266383961366237393030316662613734636331333139653535313530323033303130303031281a320608001000181d3a60666666383030656134323830643632633963316666333333636634333031393465306638616632383262383133623435323131333238353333636637326639663134363434633036303461616366313262313635623561366230353961636333420a0a04228e478110a48803420a0a04364a3c7810a48803420a0a04505546c510a38803420a0a04228e478110a38803420a0a04364a3c7810a38803420a0a04505546c510a488034a1c486f7374656420627920616272646e207c204c6f6e646f6e2c20554b50a4a2fcd0daaae18c010a9b0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303061313365303030633633343962366238303565663538643036363132303131303762373534366135396432626434653064373633333363333834653361333361393436366338366665373866356462383062616663616263313737636637633961626536326163343838336539363336393735633665393538393738353465613163643366623830376237653630626539656231663238356339306661643230366265366661303163613134636666313161326264616539366630303030386261616234343361353338373463323539336337366230613362646462346132306164353762326635666534343430353965383539316636623533626266393233393634333666306137333934323364613833346537346333666366663332663464363937343334303838636365653737373331373236343064636234393432326666363638613334333131663730373838343937616662643064636536316439653362366434623833643533623331663237616664356337366365373763396566383062643764666139323861373466316131643233393437663266313439373832366661366638383034346565313731383538383032313334643965326461653735623765333937616563336138323666383930643730306138613233393666656639363733663737616530363333333439343130643937353837343765613866663238373866613733616331646561373962376365363830663138666239623830383135613735626531323431336435366261643733303131366530656136653930333863326432343765663065663935623164643033663632623866316131333636353538383937653433323461643036616139336663643935313662363430343266376265343038373861633738653761396334303434376665333838373866383231386135326665363431333262333939333665363630333039623034643037646337323266633439356263396263653831333864306536326338366563353363376639636339393763336436636438613931353230313839656230323033303130303031281b320608001000181e3a60393737333639316332393935353531393332653035326537646338303533326233316438343730656332646233373935366365383830333638313739363534333633303066303064393562613561373530633262373839316338623636613961420a0a0423eaf99610a48803420a0a0422c9b1d410a48803420a0a0422c9b1d410a38803420a0a0423eaf99610a388034a24486f7374656420666f722044656c6c207c204672616e6b667572742c204765726d616e7950a4a2fcd0daaae18c010abc0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039386538633539623263633133386236366333386562383137306435663364353561616462633037633835666639346338653965626631326139343736616535343665656339343665356161633436373539326661653263626433633362306366656562363833366537616237633137373830333661376532653161363763323765326661373135353532663232623837663632303662333135303938613938303238343061383735343030306330353165393465343033336465333762383437613165316236643863356163616365383164633763343935396239373530383634326264376333323032346662316364616437343535366238386435373765376133326535633437303362343931353161373163666237303130613134383433663239636463383936636361656632656532613631363931306632326464363566323164393961633335313532356130643234366330363666346566623962643461363430333165663164326663336638363461633863386638313462623365633030373539363937313034663362386231663364306161646536313363373438663834323264623630663566616139366637656439653636646438306439623664316564666464636164643739316365663036306533393330383261363166656130623066393936646435346532383766373562646530316536666364643832363938636362393065336565326532333539366138373036626464303466353666633934666334313730363131323835333631313064643963353832356537326565396335326135376233333265646636656231666566316433343235666465646164343031626462386339653261303730363738376365373863303061373430303733393834326230336335376234383331656636363133353164363238326534613666326332343861376266303533643664393439363635613638323039313436356134643064663432643831663534343837346631373439373664613731373034376566363036636538333234306366353436666666623761363930323033303130303031281c320608001000181f3a60663733313362633038623964346263373934636231343034643166343832613733616335666530633032393362356337333634376465333834316230353931303636363234653939323231373264353432313262316239653661373930393038420a0a04d94c39a510a48803420a0a04034d5efe10a38803420a0a04226b4eb310a48803420a0a04d94c39a510a38803420a0a04226b4eb310a38803420a0a04034d5efe10a488034a2d486f7374656420627920434f46524120486f6c64696e6773207c204672616e6b667572742c204765726d616e7950a4a2fcd0daaae18c010a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063376630636364316436313465336236626139373536663766393438323030613134636235336639633333343862373431653364643064323332643135313362656231666236393531653338376264356266643935656433653961303166343930363631363330613061646437386131336131613232396533633630623238653830366639346465373266653435373634333132313566306664633161643937663830386336646133653961306164633431353937336563343862383935363634636434353261663230646161633432333232623037656433356136316362323730306364623639386131343865636662633635373935363039303433363661353534346639363563653530666539383234366664366466323537353938396564633631383565633339616432326239353233666231643261313136393430646136306164633064353564303033313565666665323130643162666235623535366230313561383335633132386434613333643566363933386363623733633165663266313230653662663030393737663765346562333137346134373434653232313561643438373337613039366264333965333266643939643533306365343261376261653535616265373362376430613338656639643062346139666432373532336236633864306461666537313631613264323864653832626362373464373531636236633238333431373638633065653036356134383136393633376239323466613463363763393164623434636166353735333838393034626464336465343062643364323935356261633135616361623937636163373335626134653764303436353433376434623732393464653430333234373431663763356634333334383962356330653538353263363535353038653135363539343530323666373363343039666162353865336163343662386637363636643534353630393534643538613465383765653562343233353463393135653332373361666662633161626461626534323565616539623739343630626437633462663330323033303130303031281d32060800100018203a60353636626538323639636636623133393964636138323038386436303735356430656463303561316231663438663366623664626233306338343235663335313462613563613062653363353436643131393930353836363138663366363635420a0a042256ba9710a48803420a0a04031451e610a48803420a0a042256ba9710a38803420a0a04031451e610a388034a22486f7374656420666f722048697461636869207c2056697267696e69612c205553415092a983eac8d0da92010abc0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303062646339343462333836373836343062653631653165653835303062303734343764313264633762313663353762636261363362633134666638386534376433363938383765303739343939373331333563386438633562363531353561613064303830653832396333663231613037633237343665333831363365663863366237313433313831306362323865616138643735646238343035356163663962353663393663386234376335313632633661613638616639653164623638336434363337333839643963383835383064383637336338663933303562363764326236356562316135626431316535376239333065396534663235653566633431376362646133346433323164326636646137663930393765326539653364623834313435653038633638323563633133633538356436393436363230633566336165353461356562393666616230323338313536623135386332613631643435313138306137343865666362343764306632323264376338393563333735656233636563616562313165343966653337383139623939666536373533623463643831383939353038653830666531306666353435346231663364643864376236613033633232653664333034613862343366653033636338386237613836323439656564343362363238386562336239356531383131663430356362333963386333336332303865643638656239613530333937333032313330636133393735656564393937363762663964623664373630323936323463336531303462363566646237323733336532393436386533323964373063623162323536316261633436643264656261393035333963663834623662616162313735303634643036633730623939376231313035363039663038613333323136336536313939613762303432303433623664383334623164306666663438643837633639313730616162313864386435363435323766356362363836356136386163356135633633313064376531666630376437646363343339663839356335666661646463626430323033303130303031281e32060800100018213a60336533313735656138616132656337353562643334363237353331376566626633363330666666663331633665623038633763393131643464323438333435313866643862636434373463663963663532323562346332363664346630653065420a0a041288411610a38803420a0a04228eace410a38803420a0a04228eace410a48803420a0a041288411610a488034a45486f7374656420666f72204d6f6e64656cc4937a20496e7465726e6174696f6e616c207c2053696e6761706f72652c2052657075626c6963206f662053696e6761706f726550a4a2fcd0daaae18c010a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303065306563336265386535646230626330316536383832353138633265623536373366336532613131353666353436383662633839613934333334363836336534373938366162613766333537366264343738323063356565616564633332383438343736646533333365396339383435373733383230373934303036366632643534653864343165393032373932333364633363656266303735303866616262363836393261663566316334363737333462356131313866393534313361353263383939313561363939663339643266396330376665623930346331366537393635633337666165303237653733363435376565333531336263656631613662333034343261333130663233356361373331366536316135336263393166333131373862383530386164383661333737366365383262373565353032353038636239313435353839646632653365346237323663373961386532326533396438323432626233353662656264326339363636666430653433396636383031363134663632313363373139646562366539353966646166393632316365373936373862306533656166303361626465663261633663646535613837353238643731653639363031656331373330393136663138643864346132386566373464313134323562656362626661353439313166323632333933316532303337623664396131303662343762633630633961363239366563383537653035383264613063393739663931373337646363303239616635626265333464653663323363373962333237613639663532653337633661353862616130653438376463653634323163616535343066363230393766356631323232653461373065323638353935353237363032616634313361353764383864363765373461636262326432383631323633613335396133343632333936346633346566646261363733323566333133336339613064356632306333303961653237616131623765633866376539383133363433663338306163336264663164636332363435646262613433646630323033303130303031281f32060800100018223a60656164643732666366363066616233343232386337323961366432353834616436353432633265346537383561333531643331656338333235306434383264343064656136313737666364626364366530316163623365383063396230636138420a0a0422108bf810a38803420a0a04239bd45a10a48803420a0a04239bd45a10a38803420a0a0422108bf810a488034a22486f7374656420666f7220426974476f207c2043616c69666f726e69612c205553415092a983eac8d0da9201"; diff --git a/src/client/addressbooks/previewnet.js b/src/client/addressbooks/previewnet.js index 92912175b..29736ad03 100644 --- a/src/client/addressbooks/previewnet.js +++ b/src/client/addressbooks/previewnet.js @@ -1,2 +1,2 @@ export const addressBook = - "0a910822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039663166386131323163326664366337366664353038643365343239663063363462636234346338326137303537333535326161646361643037313536396537323139353866356135643039663935383766666166636662653533343161326630313134616361653334366566336339303231336433343336656262323766343335306339393063356338633366386531653336373037626330386434323536303832336533663234653039613033616430393535613530393830313936323964643034623237623235316463653035356633646463623061343164363666303934316230623837636466653334393864343630333861623564663036663632613561646530383539383537336138386338663538363064633134393261366531383634383561396231333235306536643137623830636433396335633831393130396537336361373332646232336566386261613737366563383563653030393162656362326564656662616135656433653564626662643166383835613466613838316166336631343461386135363538353335333364383933393335393230383662326431643336326534356266653166623435363833616261366336343039373961643662343638373731383437323663366562643538623265616538356337636665336662616265663566366363656438353030333462333834373230366332643637386333363138373630323662386433353165303032616635653066666536663562316632393566646332663436396361613264323338316561306234386361393837636332633865363335653862313963653565313732613933373631613864343930613961343531386437323535383830613134643737623762613737343839326239326134306262383133363265333466633664353137386439623330313132393334323035636237376662396132383234323733393435363461383535346561343732383661343766383632333965373563393437383963653938633939383434373832343632393434663631333136376437623530323033303130303031280032060800100018033a60666664366164613734613361333461393034626561343736303330383666386265663362366265313861626564343463346434306531326662313330623937626436623835356165633564306239306230623863373335346435663362306534420a0a0423e7d09410a38803420a0a0403d3f8ac10a38803420a0a0403d3f8ac10a48803420a0a0423e7d09410a488034a22486f7374656420627920486564657261207c204561737420436f6173742c2055534150000a910822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063353537616635373966613833353031626538393962323839303737363562666466636435326162343332623031393561316631656364383666633030616236633535303962306664643937656464336362356365613536613239356633313261626235353038333164626639363366343530313138623466636336653232636634363736323030636539636338656466626266353538646336396630323432363461643764336461623233626564323133336332373465363933343438393135356462313038376639303337303930356336343138356136323131646337343266623961363930396438323138363934376232373734363364666233666630616364343765666631326561643166363937326566326331323033373933633435653737353735626534666131313063376534306661386462396336313837643131336634373034303134313739303731616266353962653764326230646538326465343231356463323535303662316339633236653439313734303163393937353036653337376536626630336236383837323765373934306661643639633565306461336364356362643262653737373335306165613264306434376539376134343863383462653663653133346436346265653039383563323931363266346331653536376363613933643036613363316265386162636533356235353766623737663466653637316136366465633739303735366430653838313831363566326261636161383931616165376163373433376663373137356236656236646562373437323337383735316262366266396230653134383366393636386539666462643536303463333962313464396532626564656563383436613938306437303464313731653762613462376663643161333064393435636131326634376133323564393339386161313866393730363630353464346431356663383939346532646562653733653932373164353438363833663631656134346662323530373165333531386137386564336562333765373161303639316632363730323033303130303031280132060800100018043a60663064393461636366366466663337323837346339646264386437393932656233313761663530303163613431393661626132363538303963623364323030626139363161353433386333613565643035633833626466396364313135643232420a0a040385d59210a38803420a0a0423c70fb110a38803420a0a0423c70fb110a48803420a0a040385d59210a488034a22486f7374656420627920486564657261207c204561737420436f6173742c2055534150000a8e0822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039626134353762373333303566303461393163633436623162393635633465383431373531616263386231343135613062616466643166333263323438323338366132323732356562376563373464656132316535303631376436343865613561633339333734316162303162386566623332313233396238643466646231646662656239653366333961613436353830646430343564313863613434643030326333376464623532376363653464646333326266633733343139363731663463613434363461336632613834666338356337316163663065356138393632366466363961383134373465643136353239663830316138616661393765343335633465303461393634613335373532373238383834336535386630613035636635313533656534353037623263363862336437666235346165366139356139353963383761313266363330653935633762316233633336393565383538363632343137393236643736633136393833666166363132323530333837343539303765396366313364363763326163643530336361343531633835393333616334313138616363323739383031636239363833343939303331343563656432373632396464303839313633313730393335383761373763323230356366613532353433623533633362366561313562383465336432633330633165643735326134363333633336623235623938393365613032616435363265623962373836386233623466343766346132356533353630363439363261633762323565353832393434663030643330373938613236326639323134643863356537346430613833373663633264366261363465313866356534613430616661633632353036326432636132336364323830303730383332316433383334333134663065353834343835393233323637336133326537306165306437313165333130353831626364623134653837313334363934633665303933306634366233376239366434396136343537333934373333316537653530376439653536646535653631343666326630323033303130303031280232060800100018053a60636136373865626362643364633836343866376564303366623539663065323161663637353133656165653531333138653662353439626535616365393036656463316666613236643933613537616365633962653737663430656165656437420a0a0423e1c9c310a38803420a0a04340f698210a48803420a0a0423e1c9c310a48803420a0a04340f698210a388034a1f486f7374656420627920486564657261207c2043656e7472616c2c2055534150000a910822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063343263636163356662633639316662626562646138376666643165373562646364383932323439346366343466646263636565343937383835323163333738626637376462303933346563306432313833643763353164623636663836346331316162376465316163336334636664633166303933613264366633376532623334636265346338313331663936383361643432383738633833643335353463363435616131363762636662303634613833646334356335623131353834393966396439323538376666663761626364356632323163643831353035343834313330303066613665353635393038396231646664363537363665613738656165646663613662343534353566643861623539383464626533356535373935643263363335656137393734643433653865616534666562666665343932653730376234386231623066633634383161653965303964333931333330303962376432363430326536653532653565393162326233383064383866306265376662346233303365373032313937383530353761613934636539323463343932366539313635363932383665383662336261363531636132613061363364663466363930376665666533343833643933623463653164346430336337313432313131333735623263326335316434656238333965333761663533306232636264366635306434636233366532373933373137306439636464616330616365326363323462383034623061323733353163663833306237363532356532366466623964626634396130353636323461373638363234393465373236336430643730636562616539353239343365353538343266356361643133666366363061326536646366376131643533336633613562623534656332313931386337366535323562613239313436363735383331653137653336633631666538353439383832386430396237363230313534313262326535323738343962616563316366666337376465346332393463353530383131653539386666323464613135613334353639646430323033303130303031280332060800100018063a60323437316633666538313430363831666539313931336432636330363366303635653434393061653632666635643534386135616265313331643261663936636265336163323562626532343336366361346638663065373663663934356633420a0a0423f76d8710a38803420a0a0423f76d8710a48803420a0a0436f1260110a38803420a0a0436f1260110a488034a22486f7374656420627920486564657261207c205765737420436f6173742c2055534150000a910822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039303266303439306139623766356432636431633064393663366136393930663537336235663065623562646262613339363631656630323330393234313933343436363939363961363861346337303731643332393939306662313739326539303031636235353938656137316332643636373638323433323065653463616266316464333537616537663261646265646331623162306139643935363233373739623463346337623437633437383761313665653731383863373231373137373632346139323634616233396334316637666630623435613839626461343063346164303763346435393664356630396437303536626362356133356634346639356135396332363665303938393264636265343661643531663264326233653939316138663636353865316632636239346337373365623434633434653839326431653535633130373666313630383331396565363537653430663139323936373534336162343261623232323338366431373538366532353337343864616264303235653530623530616536303530373230653233396436346565366662343530376330363134646434626537616664623133333038393066663361366531373635323763333131366166313239613961633565333336643966363031653731323761366437643832306164326639303264616339623234383636386131626162303864313033343265613639613730393731333266663731323063633634666364653738343063363536626131373332626139356539633336373531313735653465633364383461376530643238383432623431626262626436663238653436633361363633336531383237393635633535383230643530646165326230343635636330643432653139356239643135333265363232356562393938643661343930373961386131636434643031373564653363383766393736313438343762336362623137616133346265383230623762336164393861633366616566393933613637373839373437383263306334616533666162626363343330323033303130303031280432060800100018073a60663335373837336434313134613161656630336164633662613639656661663236393065323237616263313661366663366535303439613633666264393638383030346231346534363363323065333834333661336132346433313832646438420a0a0436b1337f10a48803420a0a0436b1337f10a38803420a0a0423eb413310a38803420a0a0423eb413310a488034a22486f7374656420627920486564657261207c205765737420436f6173742c2055534150000a910822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039316437646666663738663465666265353839303435306335626339653335333462666661646164393366623761666231356263376263663637643364336234313362643939393430646438323536346164613034616232653465646630613163306238666237653161383039326539313338653936306265326363363862356239376635376432383163353837326539376134373966633834383336333136306533383633623537623333653438363962313835616365356533366264343361653566613637386339656236366631663430313437383638323662326638666137653030363066343430356330613866396461373230356666343638336132343366613066333135663161666262346134643134306430323233346534343733666239326663623338663365623238633630636637636266623634653036396331383038366534646436313933383932306165306664376331393365366531303465363562383137656439333938653233323233376664663038333232633963656330396434303939323732613763303135643232623464636339363966366561316635313839303231303564663630303932623535613431623466333262393537623537643834653562323233393035653836393839353137333365613966326532343631656330643635323265653831366435383530666163666562343132636666396239393934336138376463306430343634343763653933623937653136643733623936623432363339363266383166636639343538653537353737633738306136663136313561613761313233323637333865323639626237333166383965383931363232653537376561353434323062663063613436626536666334663731636632363831616330323532616138383565313362653637326364323834353930343237646364313337636633313136323565386265653362303866646361616634363562333837636537636233333831366632633134613662393961633764373334333138636663353962376564393339626166656638373930323033303130303031280532060800100018083a60343933316137383230326435356631306233313537353738356333663433396462363831396264313130303364663762633263653932653239613531376237633231383830646562346330313739353734346235373663643433623834393864420a0a04235359ab10a38803420a0a04226af74110a38803420a0a04226af74110a48803420a0a04235359ab10a488034a22486f7374656420627920486564657261207c205765737420436f6173742c2055534150000a910822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063366531386338666266346364346562313034353432636232306161616132353264393566303532663130383664353831633434616437333762663636373663306333663738396166353236356238616662373962353039313264613834653061666366373534376362316666663038643035323730313765623664633563646638336235313936396434343333366136333837636437306239346266346339626166323032393834306535663466383633643730383166306661383165303836336164656462386238396135646163326262353532643665376239666261323232616332386335373037353533386663393537393932393432643334316661323837366536623530376539636537656435373265386366646135646566613336346664663864386532333832396134636362623437386631316565653362333261623835653037323935316335643934323031313566626133323730373334393466343362356636626562663834313532653335366537623136626137363462376133623532636232373334363430313633626531343635653664316661346336653666363636383461363335633961353536616137313030646265363435646638663463343233616534356130386362333562346263313837383836653232393962356330323130613566626133623934343966343833656639346564393232653165393863313133626531363662383963373335383232343331333564343432333036616265356137316237373031386666333335643664643739353432363937623136383233386239363732376664313333396235663832613362366135393764393736303337616532353036343536633862333465396662663362633332343130343431633462666338656261353835393732353465666562666161373838303961356338383534373239613562613738656365313966633834303764643838393461366263373834343033376438373863616365366331353263326538396538613634623036386136633233376530393939336265383036383930323033303130303031280632060800100018093a60363465303938363135626634303566376564356134303133343436623839633438386366636436626232356134613637366463373765656131316433336437303236383266306136396138303330653863353737376430653432323033373939420a0a043212115d10a38803420a0a04227d173110a48803420a0a043212115d10a48803420a0a04227d173110a388034a22486f7374656420627920486564657261207c205765737420436f6173742c205553415000"; + "0a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039663166386131323163326664366337366664353038643365343239663063363462636234346338326137303537333535326161646361643037313536396537323139353866356135643039663935383766666166636662653533343161326630313134616361653334366566336339303231336433343336656262323766343335306339393063356338633366386531653336373037626330386434323536303832336533663234653039613033616430393535613530393830313936323964643034623237623235316463653035356633646463623061343164363666303934316230623837636466653334393864343630333861623564663036663632613561646530383539383537336138386338663538363064633134393261366531383634383561396231333235306536643137623830636433396335633831393130396537336361373332646232336566386261613737366563383563653030393162656362326564656662616135656433653564626662643166383835613466613838316166336631343461386135363538353335333364383933393335393230383662326431643336326534356266653166623435363833616261366336343039373961643662343638373731383437323663366562643538623265616538356337636665336662616265663566366363656438353030333462333834373230366332643637386333363138373630323662386433353165303032616635653066666536663562316632393566646332663436396361613264323338316561306234386361393837636332633865363335653862313963653565313732613933373631613864343930613961343531386437323535383830613134643737623762613737343839326239326134306262383133363265333466633664353137386439623330313132393334323035636237376662396132383234323733393435363461383535346561343732383661343766383632333965373563393437383963653938633939383434373832343632393434663631333136376437623530323033303130303031280032060800100018033a60666664366164613734613361333461393034626561343736303330383666386265663362366265313861626564343463346434306531326662313330623937626436623835356165633564306239306230623863373335346435663362306534420a0a0423e7d09410a38803420a0a0403d3f8ac10a38803420a0a0423e7d09410a48803420a0a0403d3f8ac10a488034a22486f7374656420627920486564657261207c204561737420436f6173742c2055534150809a9b96cab89abd020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063353537616635373966613833353031626538393962323839303737363562666466636435326162343332623031393561316631656364383666633030616236633535303962306664643937656464336362356365613536613239356633313261626235353038333164626639363366343530313138623466636336653232636634363736323030636539636338656466626266353538646336396630323432363461643764336461623233626564323133336332373465363933343438393135356462313038376639303337303930356336343138356136323131646337343266623961363930396438323138363934376232373734363364666233666630616364343765666631326561643166363937326566326331323033373933633435653737353735626534666131313063376534306661386462396336313837643131336634373034303134313739303731616266353962653764326230646538326465343231356463323535303662316339633236653439313734303163393937353036653337376536626630336236383837323765373934306661643639633565306461336364356362643262653737373335306165613264306434376539376134343863383462653663653133346436346265653039383563323931363266346331653536376363613933643036613363316265386162636533356235353766623737663466653637316136366465633739303735366430653838313831363566326261636161383931616165376163373433376663373137356236656236646562373437323337383735316262366266396230653134383366393636386539666462643536303463333962313464396532626564656563383436613938306437303464313731653762613462376663643161333064393435636131326634376133323564393339386161313866393730363630353464346431356663383939346532646562653733653932373164353438363833663631656134346662323530373165333531386137386564336562333765373161303639316632363730323033303130303031280132060800100018043a60663064393461636366366466663337323837346339646264386437393932656233313761663530303163613431393661626132363538303963623364323030626139363161353433386333613565643035633833626466396364313135643232420a0a0423c70fb110a48803420a0a040385d59210a48803420a0a0423c70fb110a38803420a0a040385d59210a388034a22486f7374656420627920486564657261207c204561737420436f6173742c2055534150809a9b96cab89abd020a960822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039626134353762373333303566303461393163633436623162393635633465383431373531616263386231343135613062616466643166333263323438323338366132323732356562376563373464656132316535303631376436343865613561633339333734316162303162386566623332313233396238643466646231646662656239653366333961613436353830646430343564313863613434643030326333376464623532376363653464646333326266633733343139363731663463613434363461336632613834666338356337316163663065356138393632366466363961383134373465643136353239663830316138616661393765343335633465303461393634613335373532373238383834336535386630613035636635313533656534353037623263363862336437666235346165366139356139353963383761313266363330653935633762316233633336393565383538363632343137393236643736633136393833666166363132323530333837343539303765396366313364363763326163643530336361343531633835393333616334313138616363323739383031636239363833343939303331343563656432373632396464303839313633313730393335383761373763323230356366613532353433623533633362366561313562383465336432633330633165643735326134363333633336623235623938393365613032616435363265623962373836386233623466343766346132356533353630363439363261633762323565353832393434663030643330373938613236326639323134643863356537346430613833373663633264366261363465313866356534613430616661633632353036326432636132336364323830303730383332316433383334333134663065353834343835393233323637336133326537306165306437313165333130353831626364623134653837313334363934633665303933306634366233376239366434396136343537333934373333316537653530376439653536646535653631343666326630323033303130303031280232060800100018053a60636136373865626362643364633836343866376564303366623539663065323161663637353133656165653531333138653662353439626535616365393036656463316666613236643933613537616365633962653737663430656165656437420a0a0423e1c9c310a38803420a0a04340f698210a38803420a0a04340f698210a48803420a0a0423e1c9c310a488034a1f486f7374656420627920486564657261207c2043656e7472616c2c2055534150809a9b96cab89abd020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063343263636163356662633639316662626562646138376666643165373562646364383932323439346366343466646263636565343937383835323163333738626637376462303933346563306432313833643763353164623636663836346331316162376465316163336334636664633166303933613264366633376532623334636265346338313331663936383361643432383738633833643335353463363435616131363762636662303634613833646334356335623131353834393966396439323538376666663761626364356632323163643831353035343834313330303066613665353635393038396231646664363537363665613738656165646663613662343534353566643861623539383464626533356535373935643263363335656137393734643433653865616534666562666665343932653730376234386231623066633634383161653965303964333931333330303962376432363430326536653532653565393162326233383064383866306265376662346233303365373032313937383530353761613934636539323463343932366539313635363932383665383662336261363531636132613061363364663466363930376665666533343833643933623463653164346430336337313432313131333735623263326335316434656238333965333761663533306232636264366635306434636233366532373933373137306439636464616330616365326363323462383034623061323733353163663833306237363532356532366466623964626634396130353636323461373638363234393465373236336430643730636562616539353239343365353538343266356361643133666366363061326536646366376131643533336633613562623534656332313931386337366535323562613239313436363735383331653137653336633631666538353439383832386430396237363230313534313262326535323738343962616563316366666337376465346332393463353530383131653539386666323464613135613334353639646430323033303130303031280332060800100018063a60323437316633666538313430363831666539313931336432636330363366303635653434393061653632666635643534386135616265313331643261663936636265336163323562626532343336366361346638663065373663663934356633420a0a0423f76d8710a38803420a0a0436f1260110a48803420a0a0423f76d8710a48803420a0a0436f1260110a388034a22486f7374656420627920486564657261207c205765737420436f6173742c2055534150809a9b96cab89abd020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039303266303439306139623766356432636431633064393663366136393930663537336235663065623562646262613339363631656630323330393234313933343436363939363961363861346337303731643332393939306662313739326539303031636235353938656137316332643636373638323433323065653463616266316464333537616537663261646265646331623162306139643935363233373739623463346337623437633437383761313665653731383863373231373137373632346139323634616233396334316637666630623435613839626461343063346164303763346435393664356630396437303536626362356133356634346639356135396332363665303938393264636265343661643531663264326233653939316138663636353865316632636239346337373365623434633434653839326431653535633130373666313630383331396565363537653430663139323936373534336162343261623232323338366431373538366532353337343864616264303235653530623530616536303530373230653233396436346565366662343530376330363134646434626537616664623133333038393066663361366531373635323763333131366166313239613961633565333336643966363031653731323761366437643832306164326639303264616339623234383636386131626162303864313033343265613639613730393731333266663731323063633634666364653738343063363536626131373332626139356539633336373531313735653465633364383461376530643238383432623431626262626436663238653436633361363633336531383237393635633535383230643530646165326230343635636330643432653139356239643135333265363232356562393938643661343930373961386131636434643031373564653363383766393736313438343762336362623137616133346265383230623762336164393861633366616566393933613637373839373437383263306334616533666162626363343330323033303130303031280432060800100018073a60663335373837336434313134613161656630336164633662613639656661663236393065323237616263313661366663366535303439613633666264393638383030346231346534363363323065333834333661336132346433313832646438420a0a0436b1337f10a38803420a0a0423eb413310a48803420a0a0436b1337f10a48803420a0a0423eb413310a388034a22486f7374656420627920486564657261207c205765737420436f6173742c2055534150809a9b96cab89abd020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039316437646666663738663465666265353839303435306335626339653335333462666661646164393366623761666231356263376263663637643364336234313362643939393430646438323536346164613034616232653465646630613163306238666237653161383039326539313338653936306265326363363862356239376635376432383163353837326539376134373966633834383336333136306533383633623537623333653438363962313835616365356533366264343361653566613637386339656236366631663430313437383638323662326638666137653030363066343430356330613866396461373230356666343638336132343366613066333135663161666262346134643134306430323233346534343733666239326663623338663365623238633630636637636266623634653036396331383038366534646436313933383932306165306664376331393365366531303465363562383137656439333938653233323233376664663038333232633963656330396434303939323732613763303135643232623464636339363966366561316635313839303231303564663630303932623535613431623466333262393537623537643834653562323233393035653836393839353137333365613966326532343631656330643635323265653831366435383530666163666562343132636666396239393934336138376463306430343634343763653933623937653136643733623936623432363339363266383166636639343538653537353737633738306136663136313561613761313233323637333865323639626237333166383965383931363232653537376561353434323062663063613436626536666334663731636632363831616330323532616138383565313362653637326364323834353930343237646364313337636633313136323565386265653362303866646361616634363562333837636537636233333831366632633134613662393961633764373334333138636663353962376564393339626166656638373930323033303130303031280532060800100018083a60343933316137383230326435356631306233313537353738356333663433396462363831396264313130303364663762633263653932653239613531376237633231383830646562346330313739353734346235373663643433623834393864420a0a04235359ab10a48803420a0a04226af74110a38803420a0a04226af74110a48803420a0a04235359ab10a388034a22486f7374656420627920486564657261207c205765737420436f6173742c2055534150809a9b96cab89abd020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063366531386338666266346364346562313034353432636232306161616132353264393566303532663130383664353831633434616437333762663636373663306333663738396166353236356238616662373962353039313264613834653061666366373534376362316666663038643035323730313765623664633563646638336235313936396434343333366136333837636437306239346266346339626166323032393834306535663466383633643730383166306661383165303836336164656462386238396135646163326262353532643665376239666261323232616332386335373037353533386663393537393932393432643334316661323837366536623530376539636537656435373265386366646135646566613336346664663864386532333832396134636362623437386631316565653362333261623835653037323935316335643934323031313566626133323730373334393466343362356636626562663834313532653335366537623136626137363462376133623532636232373334363430313633626531343635653664316661346336653666363636383461363335633961353536616137313030646265363435646638663463343233616534356130386362333562346263313837383836653232393962356330323130613566626133623934343966343833656639346564393232653165393863313133626531363662383963373335383232343331333564343432333036616265356137316237373031386666333335643664643739353432363937623136383233386239363732376664313333396235663832613362366135393764393736303337616532353036343536633862333465396662663362633332343130343431633462666338656261353835393732353465666562666161373838303961356338383534373239613562613738656365313966633834303764643838393461366263373834343033376438373863616365366331353263326538396538613634623036386136633233376530393939336265383036383930323033303130303031280632060800100018093a60363465303938363135626634303566376564356134303133343436623839633438386366636436626232356134613637366463373765656131316433336437303236383266306136396138303330653863353737376430653432323033373939420a0a04227d173110a38803420a0a043212115d10a48803420a0a043212115d10a38803420a0a04227d173110a488034a22486f7374656420627920486564657261207c205765737420436f6173742c2055534150809a9b96cab89abd02"; diff --git a/src/client/addressbooks/testnet.js b/src/client/addressbooks/testnet.js index 6b54fa90b..b1f67e315 100644 --- a/src/client/addressbooks/testnet.js +++ b/src/client/addressbooks/testnet.js @@ -1,2 +1,2 @@ export const addressBook = - "0a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039663166386131323163326664366337366664353038643365343239663063363462636234346338326137303537333535326161646361643037313536396537323139353866356135643039663935383766666166636662653533343161326630313134616361653334366566336339303231336433343336656262323766343335306339393063356338633366386531653336373037626330386434323536303832336533663234653039613033616430393535613530393830313936323964643034623237623235316463653035356633646463623061343164363666303934316230623837636466653334393864343630333861623564663036663632613561646530383539383537336138386338663538363064633134393261366531383634383561396231333235306536643137623830636433396335633831393130396537336361373332646232336566386261613737366563383563653030393162656362326564656662616135656433653564626662643166383835613466613838316166336631343461386135363538353335333364383933393335393230383662326431643336326534356266653166623435363833616261366336343039373961643662343638373731383437323663366562643538623265616538356337636665336662616265663566366363656438353030333462333834373230366332643637386333363138373630323662386433353165303032616635653066666536663562316632393566646332663436396361613264323338316561306234386361393837636332633865363335653862313963653565313732613933373631613864343930613961343531386437323535383830613134643737623762613737343839326239326134306262383133363265333466633664353137386439623330313132393334323035636237376662396132383234323733393435363461383535346561343732383661343766383632333965373563393437383963653938633939383434373832343632393434663631333136376437623530323033303130303031280032060800100018033a60613137316533626138333437363734376165623265326163346430653131356361616162393138323033623064666531636465616234343334333866633238396162633862613861366166663833646235663162333334303436646138386338420a0a04321284d310a38803420a0a04225e6a3d10a38803420a0a04225e6a3d10a48803420a0a04321284d310a488034a22486f7374656420627920486564657261207c205765737420436f6173742c20555341508088bfaa8fa880c0020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063353537616635373966613833353031626538393962323839303737363562666466636435326162343332623031393561316631656364383666633030616236633535303962306664643937656464336362356365613536613239356633313261626235353038333164626639363366343530313138623466636336653232636634363736323030636539636338656466626266353538646336396630323432363461643764336461623233626564323133336332373465363933343438393135356462313038376639303337303930356336343138356136323131646337343266623961363930396438323138363934376232373734363364666233666630616364343765666631326561643166363937326566326331323033373933633435653737353735626534666131313063376534306661386462396336313837643131336634373034303134313739303731616266353962653764326230646538326465343231356463323535303662316339633236653439313734303163393937353036653337376536626630336236383837323765373934306661643639633565306461336364356362643262653737373335306165613264306434376539376134343863383462653663653133346436346265653039383563323931363266346331653536376363613933643036613363316265386162636533356235353766623737663466653637316136366465633739303735366430653838313831363566326261636161383931616165376163373433376663373137356236656236646562373437323337383735316262366266396230653134383366393636386539666462643536303463333962313464396532626564656563383436613938306437303464313731653762613462376663643161333064393435636131326634376133323564393339386161313866393730363630353464346431356663383939346532646562653733653932373164353438363833663631656134346662323530373165333531386137386564336562333765373161303639316632363730323033303130303031280132060800100018043a60373430396465633265343934623632376565343963363962323934626531636561656263613366646361663336373839653838666337643562306565663535363166353262383264333531393161333963326662656436303237323637313636420a0a0403d4060d10a38803420a0a0403d4060d10a48803420a0a0423ed773710a38803420a0a0423ed773710a488034a22486f7374656420627920486564657261207c204561737420436f6173742c20555341508088bfaa8fa880c0020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039626134353762373333303566303461393163633436623162393635633465383431373531616263386231343135613062616466643166333263323438323338366132323732356562376563373464656132316535303631376436343865613561633339333734316162303162386566623332313233396238643466646231646662656239653366333961613436353830646430343564313863613434643030326333376464623532376363653464646333326266633733343139363731663463613434363461336632613834666338356337316163663065356138393632366466363961383134373465643136353239663830316138616661393765343335633465303461393634613335373532373238383834336535386630613035636635313533656534353037623263363862336437666235346165366139356139353963383761313266363330653935633762316233633336393565383538363632343137393236643736633136393833666166363132323530333837343539303765396366313364363763326163643530336361343531633835393333616334313138616363323739383031636239363833343939303331343563656432373632396464303839313633313730393335383761373763323230356366613532353433623533633362366561313562383465336432633330633165643735326134363333633336623235623938393365613032616435363265623962373836386233623466343766346132356533353630363439363261633762323565353832393434663030643330373938613236326639323134643863356537346430613833373663633264366261363465313866356534613430616661633632353036326432636132336364323830303730383332316433383334333134663065353834343835393233323637336133326537306165306437313165333130353831626364623134653837313334363934633665303933306634366233376239366434396136343537333934373333316537653530376439653536646535653631343666326630323033303130303031280232060800100018053a60396231343136353834613461333830626238366136633764373230376438616564646263336236336561333035393938323535626365383335316261346235646361353263393238326135346136626564363064653633636530336161613234420a0a043414125610a38803420a0a043414125610a48803420a0a0423f51bc110a38803420a0a0423f51bc110a488034a22486f7374656420627920486564657261207c204561737420436f6173742c20555341508088bfaa8fa880c0020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063343263636163356662633639316662626562646138376666643165373562646364383932323439346366343466646263636565343937383835323163333738626637376462303933346563306432313833643763353164623636663836346331316162376465316163336334636664633166303933613264366633376532623334636265346338313331663936383361643432383738633833643335353463363435616131363762636662303634613833646334356335623131353834393966396439323538376666663761626364356632323163643831353035343834313330303066613665353635393038396231646664363537363665613738656165646663613662343534353566643861623539383464626533356535373935643263363335656137393734643433653865616534666562666665343932653730376234386231623066633634383161653965303964333931333330303962376432363430326536653532653565393162326233383064383866306265376662346233303365373032313937383530353761613934636539323463343932366539313635363932383665383662336261363531636132613061363364663466363930376665666533343833643933623463653164346430336337313432313131333735623263326335316434656238333965333761663533306232636264366635306434636233366532373933373137306439636464616330616365326363323462383034623061323733353163663833306237363532356532366466623964626634396130353636323461373638363234393465373236336430643730636562616539353239343365353538343266356361643133666366363061326536646366376131643533336633613562623534656332313931386337366535323562613239313436363735383331653137653336633631666538353439383832386430396237363230313534313262326535323738343962616563316366666337376465346332393463353530383131653539386666323464613135613334353639646430323033303130303031280332060800100018063a60363438363638356234653665306362393633343732633031666539393933316664396534633434383837626138333432336165376665656432326436343834383463663861336263356363636136613337333837626639366433383637323830420a0a043646c02110a48803420a0a042253707410a38803420a0a043646c02110a38803420a0a042253707410a488034a22486f7374656420627920486564657261207c205765737420436f6173742c20555341508088bfaa8fa880c0020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039303266303439306139623766356432636431633064393663366136393930663537336235663065623562646262613339363631656630323330393234313933343436363939363961363861346337303731643332393939306662313739326539303031636235353938656137316332643636373638323433323065653463616266316464333537616537663261646265646331623162306139643935363233373739623463346337623437633437383761313665653731383863373231373137373632346139323634616233396334316637666630623435613839626461343063346164303763346435393664356630396437303536626362356133356634346639356135396332363665303938393264636265343661643531663264326233653939316138663636353865316632636239346337373365623434633434653839326431653535633130373666313630383331396565363537653430663139323936373534336162343261623232323338366431373538366532353337343864616264303235653530623530616536303530373230653233396436346565366662343530376330363134646434626537616664623133333038393066663361366531373635323763333131366166313239613961633565333336643966363031653731323761366437643832306164326639303264616339623234383636386131626162303864313033343265613639613730393731333266663731323063633634666364653738343063363536626131373332626139356539633336373531313735653465633364383461376530643238383432623431626262626436663238653436633361363633336531383237393635633535383230643530646165326230343635636330643432653139356239643135333265363232356562393938643661343930373961386131636434643031373564653363383766393736313438343762336362623137616133346265383230623762336164393861633366616566393933613637373839373437383263306334616533666162626363343330323033303130303031280432060800100018073a60333965393039393135613835323830333031353461366337373039353063376234373737626134303133353763306536313837363534323135636332306161636364643865356666323965396334643935636634313031666136386265343563420a0a0436b0c76d10a38803420a0a04225ea00410a48803420a0a0436b0c76d10a48803420a0a04225ea00410a388034a22486f7374656420627920486564657261207c205765737420436f6173742c20555341508088bfaa8fa880c0020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039316437646666663738663465666265353839303435306335626339653335333462666661646164393366623761666231356263376263663637643364336234313362643939393430646438323536346164613034616232653465646630613163306238666237653161383039326539313338653936306265326363363862356239376635376432383163353837326539376134373966633834383336333136306533383633623537623333653438363962313835616365356533366264343361653566613637386339656236366631663430313437383638323662326638666137653030363066343430356330613866396461373230356666343638336132343366613066333135663161666262346134643134306430323233346534343733666239326663623338663365623238633630636637636266623634653036396331383038366534646436313933383932306165306664376331393365366531303465363562383137656439333938653233323233376664663038333232633963656330396434303939323732613763303135643232623464636339363966366561316635313839303231303564663630303932623535613431623466333262393537623537643834653562323233393035653836393839353137333365613966326532343631656330643635323265653831366435383530666163666562343132636666396239393934336138376463306430343634343763653933623937653136643733623936623432363339363266383166636639343538653537353737633738306136663136313561613761313233323637333865323639626237333166383965383931363232653537376561353434323062663063613436626536666334663731636632363831616330323532616138383565313362653637326364323834353930343237646364313337636633313136323565386265653362303866646361616634363562333837636537636233333831366632633134613662393961633764373334333138636663353962376564393339626166656638373930323033303130303031280532060800100018083a60613434383734613761613162333737343161303731616461616537386662313532623639366431633538643864656662653164383233303435333261306330313965653936636331396437353638363537386433396131653663333161316565420a0a04226a66da10a38803420a0a04239b319310a38803420a0a04239b319310a48803420a0a04226a66da10a488034a22486f7374656420627920486564657261207c205765737420436f6173742c20555341508088bfaa8fa880c0020a960822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063366531386338666266346364346562313034353432636232306161616132353264393566303532663130383664353831633434616437333762663636373663306333663738396166353236356238616662373962353039313264613834653061666366373534376362316666663038643035323730313765623664633563646638336235313936396434343333366136333837636437306239346266346339626166323032393834306535663466383633643730383166306661383165303836336164656462386238396135646163326262353532643665376239666261323232616332386335373037353533386663393537393932393432643334316661323837366536623530376539636537656435373265386366646135646566613336346664663864386532333832396134636362623437386631316565653362333261623835653037323935316335643934323031313566626133323730373334393466343362356636626562663834313532653335366537623136626137363462376133623532636232373334363430313633626531343635653664316661346336653666363636383461363335633961353536616137313030646265363435646638663463343233616534356130386362333562346263313837383836653232393962356330323130613566626133623934343966343833656639346564393232653165393863313133626531363662383963373335383232343331333564343432333036616265356137316237373031386666333335643664643739353432363937623136383233386239363732376664313333396235663832613362366135393764393736303337616532353036343536633862333465396662663362633332343130343431633462666338656261353835393732353465666562666161373838303961356338383534373239613562613738656365313966633834303764643838393461366263373834343033376438373863616365366331353263326538396538613634623036386136633233376530393939336265383036383930323033303130303031280632060800100018093a60363938333261373361333630326538643166626535616435386431633236333761316236373264373165653837616631306462363438656239316166623232383235336231663437653537643364346134346666353437623333393461613232420a0a042285c5e610a48803420a0a04340efccf10a48803420a0a042285c5e610a38803420a0a04340efccf10a388034a1f486f7374656420627920486564657261207c2043656e7472616c2c20555341508088bfaa8fa880c002"; + "0a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039663166386131323163326664366337366664353038643365343239663063363462636234346338326137303537333535326161646361643037313536396537323139353866356135643039663935383766666166636662653533343161326630313134616361653334366566336339303231336433343336656262323766343335306339393063356338633366386531653336373037626330386434323536303832336533663234653039613033616430393535613530393830313936323964643034623237623235316463653035356633646463623061343164363666303934316230623837636466653334393864343630333861623564663036663632613561646530383539383537336138386338663538363064633134393261366531383634383561396231333235306536643137623830636433396335633831393130396537336361373332646232336566386261613737366563383563653030393162656362326564656662616135656433653564626662643166383835613466613838316166336631343461386135363538353335333364383933393335393230383662326431643336326534356266653166623435363833616261366336343039373961643662343638373731383437323663366562643538623265616538356337636665336662616265663566366363656438353030333462333834373230366332643637386333363138373630323662386433353165303032616635653066666536663562316632393566646332663436396361613264323338316561306234386361393837636332633865363335653862313963653565313732613933373631613864343930613961343531386437323535383830613134643737623762613737343839326239326134306262383133363265333466633664353137386439623330313132393334323035636237376662396132383234323733393435363461383535346561343732383661343766383632333965373563393437383963653938633939383434373832343632393434663631333136376437623530323033303130303031280032060800100018033a60613137316533626138333437363734376165623265326163346430653131356361616162393138323033623064666531636465616234343334333866633238396162633862613861366166663833646235663162333334303436646138386338420a0a04321284d310a48803420a0a04225e6a3d10a38803420a0a04321284d310a38803420a0a04225e6a3d10a488034a22486f7374656420627920486564657261207c205765737420436f6173742c205553415080aefb83ebfdfebf020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063353537616635373966613833353031626538393962323839303737363562666466636435326162343332623031393561316631656364383666633030616236633535303962306664643937656464336362356365613536613239356633313261626235353038333164626639363366343530313138623466636336653232636634363736323030636539636338656466626266353538646336396630323432363461643764336461623233626564323133336332373465363933343438393135356462313038376639303337303930356336343138356136323131646337343266623961363930396438323138363934376232373734363364666233666630616364343765666631326561643166363937326566326331323033373933633435653737353735626534666131313063376534306661386462396336313837643131336634373034303134313739303731616266353962653764326230646538326465343231356463323535303662316339633236653439313734303163393937353036653337376536626630336236383837323765373934306661643639633565306461336364356362643262653737373335306165613264306434376539376134343863383462653663653133346436346265653039383563323931363266346331653536376363613933643036613363316265386162636533356235353766623737663466653637316136366465633739303735366430653838313831363566326261636161383931616165376163373433376663373137356236656236646562373437323337383735316262366266396230653134383366393636386539666462643536303463333962313464396532626564656563383436613938306437303464313731653762613462376663643161333064393435636131326634376133323564393339386161313866393730363630353464346431356663383939346532646562653733653932373164353438363833663631656134346662323530373165333531386137386564336562333765373161303639316632363730323033303130303031280132060800100018043a60373430396465633265343934623632376565343963363962323934626531636561656263613366646361663336373839653838666337643562306565663535363166353262383264333531393161333963326662656436303237323637313636420a0a0423ed773710a38803420a0a0403d4060d10a38803420a0a0423ed773710a48803420a0a0403d4060d10a488034a22486f7374656420627920486564657261207c204561737420436f6173742c205553415080aefb83ebfdfebf020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039626134353762373333303566303461393163633436623162393635633465383431373531616263386231343135613062616466643166333263323438323338366132323732356562376563373464656132316535303631376436343865613561633339333734316162303162386566623332313233396238643466646231646662656239653366333961613436353830646430343564313863613434643030326333376464623532376363653464646333326266633733343139363731663463613434363461336632613834666338356337316163663065356138393632366466363961383134373465643136353239663830316138616661393765343335633465303461393634613335373532373238383834336535386630613035636635313533656534353037623263363862336437666235346165366139356139353963383761313266363330653935633762316233633336393565383538363632343137393236643736633136393833666166363132323530333837343539303765396366313364363763326163643530336361343531633835393333616334313138616363323739383031636239363833343939303331343563656432373632396464303839313633313730393335383761373763323230356366613532353433623533633362366561313562383465336432633330633165643735326134363333633336623235623938393365613032616435363265623962373836386233623466343766346132356533353630363439363261633762323565353832393434663030643330373938613236326639323134643863356537346430613833373663633264366261363465313866356534613430616661633632353036326432636132336364323830303730383332316433383334333134663065353834343835393233323637336133326537306165306437313165333130353831626364623134653837313334363934633665303933306634366233376239366434396136343537333934373333316537653530376439653536646535653631343666326630323033303130303031280232060800100018053a60396231343136353834613461333830626238366136633764373230376438616564646263336236336561333035393938323535626365383335316261346235646361353263393238326135346136626564363064653633636530336161613234420a0a0423f51bc110a38803420a0a043414125610a48803420a0a0423f51bc110a48803420a0a043414125610a388034a22486f7374656420627920486564657261207c204561737420436f6173742c205553415080aefb83ebfdfebf020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063343263636163356662633639316662626562646138376666643165373562646364383932323439346366343466646263636565343937383835323163333738626637376462303933346563306432313833643763353164623636663836346331316162376465316163336334636664633166303933613264366633376532623334636265346338313331663936383361643432383738633833643335353463363435616131363762636662303634613833646334356335623131353834393966396439323538376666663761626364356632323163643831353035343834313330303066613665353635393038396231646664363537363665613738656165646663613662343534353566643861623539383464626533356535373935643263363335656137393734643433653865616534666562666665343932653730376234386231623066633634383161653965303964333931333330303962376432363430326536653532653565393162326233383064383866306265376662346233303365373032313937383530353761613934636539323463343932366539313635363932383665383662336261363531636132613061363364663466363930376665666533343833643933623463653164346430336337313432313131333735623263326335316434656238333965333761663533306232636264366635306434636233366532373933373137306439636464616330616365326363323462383034623061323733353163663833306237363532356532366466623964626634396130353636323461373638363234393465373236336430643730636562616539353239343365353538343266356361643133666366363061326536646366376131643533336633613562623534656332313931386337366535323562613239313436363735383331653137653336633631666538353439383832386430396237363230313534313262326535323738343962616563316366666337376465346332393463353530383131653539386666323464613135613334353639646430323033303130303031280332060800100018063a60363438363638356234653665306362393633343732633031666539393933316664396534633434383837626138333432336165376665656432326436343834383463663861336263356363636136613337333837626639366433383637323830420a0a043646c02110a38803420a0a042253707410a38803420a0a043646c02110a48803420a0a042253707410a488034a22486f7374656420627920486564657261207c205765737420436f6173742c205553415080aefb83ebfdfebf020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039303266303439306139623766356432636431633064393663366136393930663537336235663065623562646262613339363631656630323330393234313933343436363939363961363861346337303731643332393939306662313739326539303031636235353938656137316332643636373638323433323065653463616266316464333537616537663261646265646331623162306139643935363233373739623463346337623437633437383761313665653731383863373231373137373632346139323634616233396334316637666630623435613839626461343063346164303763346435393664356630396437303536626362356133356634346639356135396332363665303938393264636265343661643531663264326233653939316138663636353865316632636239346337373365623434633434653839326431653535633130373666313630383331396565363537653430663139323936373534336162343261623232323338366431373538366532353337343864616264303235653530623530616536303530373230653233396436346565366662343530376330363134646434626537616664623133333038393066663361366531373635323763333131366166313239613961633565333336643966363031653731323761366437643832306164326639303264616339623234383636386131626162303864313033343265613639613730393731333266663731323063633634666364653738343063363536626131373332626139356539633336373531313735653465633364383461376530643238383432623431626262626436663238653436633361363633336531383237393635633535383230643530646165326230343635636330643432653139356239643135333265363232356562393938643661343930373961386131636434643031373564653363383766393736313438343762336362623137616133346265383230623762336164393861633366616566393933613637373839373437383263306334616533666162626363343330323033303130303031280432060800100018073a60333965393039393135613835323830333031353461366337373039353063376234373737626134303133353763306536313837363534323135636332306161636364643865356666323965396334643935636634313031666136386265343563420a0a04225ea00410a48803420a0a0436b0c76d10a38803420a0a04225ea00410a38803420a0a0436b0c76d10a488034a22486f7374656420627920486564657261207c205765737420436f6173742c205553415080aefb83ebfdfebf020a990822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303039316437646666663738663465666265353839303435306335626339653335333462666661646164393366623761666231356263376263663637643364336234313362643939393430646438323536346164613034616232653465646630613163306238666237653161383039326539313338653936306265326363363862356239376635376432383163353837326539376134373966633834383336333136306533383633623537623333653438363962313835616365356533366264343361653566613637386339656236366631663430313437383638323662326638666137653030363066343430356330613866396461373230356666343638336132343366613066333135663161666262346134643134306430323233346534343733666239326663623338663365623238633630636637636266623634653036396331383038366534646436313933383932306165306664376331393365366531303465363562383137656439333938653233323233376664663038333232633963656330396434303939323732613763303135643232623464636339363966366561316635313839303231303564663630303932623535613431623466333262393537623537643834653562323233393035653836393839353137333365613966326532343631656330643635323265653831366435383530666163666562343132636666396239393934336138376463306430343634343763653933623937653136643733623936623432363339363266383166636639343538653537353737633738306136663136313561613761313233323637333865323639626237333166383965383931363232653537376561353434323062663063613436626536666334663731636632363831616330323532616138383565313362653637326364323834353930343237646364313337636633313136323565386265653362303866646361616634363562333837636537636233333831366632633134613662393961633764373334333138636663353962376564393339626166656638373930323033303130303031280532060800100018083a60613434383734613761613162333737343161303731616461616537386662313532623639366431633538643864656662653164383233303435333261306330313965653936636331396437353638363537386433396131653663333161316565420a0a04226a66da10a38803420a0a04239b319310a48803420a0a04226a66da10a48803420a0a04239b319310a388034a22486f7374656420627920486564657261207c205765737420436f6173742c205553415080aefb83ebfdfebf020a960822cc0633303832303161323330306430363039326138363438383666373064303130313031303530303033383230313866303033303832303138613032383230313831303063366531386338666266346364346562313034353432636232306161616132353264393566303532663130383664353831633434616437333762663636373663306333663738396166353236356238616662373962353039313264613834653061666366373534376362316666663038643035323730313765623664633563646638336235313936396434343333366136333837636437306239346266346339626166323032393834306535663466383633643730383166306661383165303836336164656462386238396135646163326262353532643665376239666261323232616332386335373037353533386663393537393932393432643334316661323837366536623530376539636537656435373265386366646135646566613336346664663864386532333832396134636362623437386631316565653362333261623835653037323935316335643934323031313566626133323730373334393466343362356636626562663834313532653335366537623136626137363462376133623532636232373334363430313633626531343635653664316661346336653666363636383461363335633961353536616137313030646265363435646638663463343233616534356130386362333562346263313837383836653232393962356330323130613566626133623934343966343833656639346564393232653165393863313133626531363662383963373335383232343331333564343432333036616265356137316237373031386666333335643664643739353432363937623136383233386239363732376664313333396235663832613362366135393764393736303337616532353036343536633862333465396662663362633332343130343431633462666338656261353835393732353465666562666161373838303961356338383534373239613562613738656365313966633834303764643838393461366263373834343033376438373863616365366331353263326538396538613634623036386136633233376530393939336265383036383930323033303130303031280632060800100018093a60363938333261373361333630326538643166626535616435386431633236333761316236373264373165653837616631306462363438656239316166623232383235336231663437653537643364346134346666353437623333393461613232420a0a04340efccf10a38803420a0a042285c5e610a38803420a0a042285c5e610a48803420a0a04340efccf10a488034a1f486f7374656420627920486564657261207c2043656e7472616c2c205553415080aefb83ebfdfebf02"; diff --git a/src/contract/ContractCallQuery.js b/src/contract/ContractCallQuery.js index 102ac2f99..d9a7af600 100644 --- a/src/contract/ContractCallQuery.js +++ b/src/contract/ContractCallQuery.js @@ -243,9 +243,10 @@ export default class ContractCallQuery extends Query { * @internal * @param {HashgraphProto.proto.IQuery} request * @param {HashgraphProto.proto.IResponse} response + * @param {AccountId} nodeId * @returns {Error} */ - _mapStatusError(request, response) { + _mapStatusError(request, response, nodeId) { const { nodeTransactionPrecheckCode } = this._mapResponseHeader(response); @@ -262,6 +263,7 @@ export default class ContractCallQuery extends Query { (response.contractCallLocal); if (!call.functionResult) { return new PrecheckStatusError({ + nodeId, status, transactionId: this._getTransactionId(), contractFunctionResult: null, @@ -271,6 +273,7 @@ export default class ContractCallQuery extends Query { const contractFunctionResult = this._mapResponseSync(response); return new PrecheckStatusError({ + nodeId, status, transactionId: this._getTransactionId(), contractFunctionResult, diff --git a/src/exports.js b/src/exports.js index 6c1359424..de6f28266 100644 --- a/src/exports.js +++ b/src/exports.js @@ -128,6 +128,8 @@ export { default as Timestamp } from "./Timestamp.js"; export { default as TokenAllowance } from "./account/TokenAllowance.js"; export { default as TokenAssociateTransaction } from "./token/TokenAssociateTransaction.js"; export { default as TokenBurnTransaction } from "./token/TokenBurnTransaction.js"; +export { default as TokenRejectTransaction } from "./token/TokenRejectTransaction.js"; +export { default as TokenRejectFlow } from "./token/TokenRejectFlow.js"; export { default as TokenCreateTransaction } from "./token/TokenCreateTransaction.js"; export { default as TokenDeleteTransaction } from "./token/TokenDeleteTransaction.js"; export { default as TokenDissociateTransaction } from "./token/TokenDissociateTransaction.js"; diff --git a/src/query/CostQuery.js b/src/query/CostQuery.js index fe896ef7f..86031bd4b 100644 --- a/src/query/CostQuery.js +++ b/src/query/CostQuery.js @@ -153,11 +153,12 @@ export default class CostQuery extends Executable { * @internal * @param {HashgraphProto.proto.IQuery} request * @param {HashgraphProto.proto.IResponse} response + * @param {AccountId} nodeId * @returns {Error} */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - _mapStatusError(request, response) { - return this._query._mapStatusError(request, response); + _mapStatusError(request, response, nodeId) { + return this._query._mapStatusError(request, response, nodeId); } /** diff --git a/src/query/Query.js b/src/query/Query.js index 27992332f..f600408ff 100644 --- a/src/query/Query.js +++ b/src/query/Query.js @@ -492,6 +492,7 @@ export default class Query extends Executable { case Status.Busy: case Status.Unknown: case Status.PlatformTransactionNotCreated: + case Status.PlatformNotActive: return [status, ExecutionState.Retry]; case Status.Ok: return [status, ExecutionState.Finished]; @@ -505,10 +506,11 @@ export default class Query extends Executable { * @internal * @param {HashgraphProto.proto.IQuery} request * @param {HashgraphProto.proto.IResponse} response + * @param {AccountId} nodeId * @returns {Error} */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - _mapStatusError(request, response) { + _mapStatusError(request, response, nodeId) { const { nodeTransactionPrecheckCode } = this._mapResponseHeader(response); @@ -519,6 +521,7 @@ export default class Query extends Executable { ); return new PrecheckStatusError({ + nodeId, status, transactionId: this._getTransactionId(), contractFunctionResult: null, diff --git a/src/token/TokenReference.js b/src/token/TokenReference.js new file mode 100644 index 000000000..8955acc09 --- /dev/null +++ b/src/token/TokenReference.js @@ -0,0 +1,40 @@ +import NftId from "./NftId.js"; +import TokenId from "./TokenId.js"; + +/** + * @namespace proto + * @typedef {import("@hashgraph/proto").proto.TokenReference} HashgraphProto.proto.TokenReference + */ + +export default class TokenReference { + constructor() { + /** + * @public + * @type {?TokenId} + */ + this.fungibleToken = null; + /** + * @public + * @type {?NftId} + */ + this.nft = null; + } + + /** + * @public + * @param {HashgraphProto.proto.TokenReference} reference + * @returns {TokenReference} + */ + static _fromProtobuf(reference) { + return { + fungibleToken: + reference.fungibleToken != undefined + ? TokenId._fromProtobuf(reference.fungibleToken) + : null, + nft: + reference.nft != undefined + ? NftId._fromProtobuf(reference.nft) + : null, + }; + } +} diff --git a/src/token/TokenRejectFlow.js b/src/token/TokenRejectFlow.js new file mode 100644 index 000000000..b583582e7 --- /dev/null +++ b/src/token/TokenRejectFlow.js @@ -0,0 +1,279 @@ +/*- + * ‌ + * Hedera JavaScript SDK + * ​ + * Copyright (C) 2020 - 2023 Hedera Hashgraph, LLC + * ​ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ‍ + */ +import TokenRejectTransaction from "../token/TokenRejectTransaction.js"; +import TokenDissociateTransaction from "../token/TokenDissociateTransaction.js"; + +/** + * @typedef {import("../PrivateKey.js").default} PrivateKey + * @typedef {import("../client/Client.js").default<*, *>} Client + * @typedef {import("../Signer.js").default} Signer + * @typedef {import("../transaction/TransactionId.js").default} TransactionId + * @typedef {import("../transaction/Transaction.js").default} Transaction + * @typedef {import("../transaction/TransactionResponse.js").default} TransactionResponse + * @typedef {import("../token/TokenId.js").default} TokenId + * @typedef {import("../token/NftId.js").default} NftId + * @typedef {import("../PublicKey.js").default} PublicKey + * @typedef {import("../account/AccountId.js").default} AccountId + */ + +/** + * Reject undesired token(s) and dissociate in a single flow. + */ +export default class TokenRejectFlow { + constructor() { + /** + * @private + * @type {?AccountId} + */ + this._ownerId = null; + + /** + * @private + * @type {TokenId[]} + */ + this._tokenIds = []; + + /** + * @private + * @type {NftId[]} + */ + this._nftIds = []; + + /** + * @private + * @type {?Client} + */ + this._freezeWithClient = null; + + /** + * @private + * @type {?PrivateKey} + */ + this._signPrivateKey = null; + + /** + * @private + * @type {?PublicKey} + */ + this._signPublicKey = null; + + /** + * @private + * @type {?(message: Uint8Array) => Promise} + */ + this._transactionSigner = null; + } + + /** + * + * @param {AccountId} ownerId + * @returns {this} + */ + setOwnerId(ownerId) { + this.requireNotFrozen(); + this._ownerId = ownerId; + return this; + } + + /** + * @returns {?AccountId} + */ + get ownerId() { + return this._ownerId; + } + + /** + * + * @param {TokenId[]} ids + * @returns {this} + */ + setTokenIds(ids) { + this.requireNotFrozen(); + this._tokenIds = ids; + return this; + } + + /** + * + * @param {TokenId} id + * @returns {this} + */ + addTokenId(id) { + this.requireNotFrozen(); + this._tokenIds.push(id); + return this; + } + + /** + * + * @returns {TokenId[]} + */ + get tokenIds() { + return this._tokenIds; + } + + /** + * + * @param {NftId[]} ids + * @returns {this} + */ + setNftIds(ids) { + this.requireNotFrozen(); + this._nftIds = ids; + return this; + } + + /** + * + * @param {NftId} id + * @returns {this} + */ + addNftId(id) { + this.requireNotFrozen(); + this._nftIds.push(id); + return this; + } + + /** + * + * @returns {NftId[]} + */ + get nftIds() { + return this._nftIds; + } + + /** + * + * @param {PrivateKey} privateKey + * @returns {this} + */ + sign(privateKey) { + this._signPrivateKey = privateKey; + this._signPublicKey = null; + this._transactionSigner = null; + return this; + } + + /** + * + * @param {PublicKey} publicKey + * @param {((message: Uint8Array) => Promise)} signer + * @returns {this} + */ + signWith(publicKey, signer) { + this._signPublicKey = publicKey; + this._transactionSigner = signer; + this._signPrivateKey = null; + return this; + } + + /** + * @param {Client} client + * @returns {this} + */ + signWithOperator(client) { + const operator = client.getOperator(); + if (operator == null) { + throw new Error("Client operator must be set"); + } + this._signPublicKey = operator.publicKey; + this._transactionSigner = operator.transactionSigner; + this._signPrivateKey = null; + return this; + } + + /** + * @private + * @param {Transaction} transaction + */ + fillOutTransaction(transaction) { + if (this._freezeWithClient) { + transaction.freezeWith(this._freezeWithClient); + } + if (this._signPrivateKey) { + void transaction.sign(this._signPrivateKey); + } else if (this._signPublicKey && this._transactionSigner) { + void transaction.signWith( + this._signPublicKey, + this._transactionSigner, + ); + } + } + /** + * + * @param {Client} client + * @returns {this} + */ + freezeWith(client) { + this._freezeWithClient = client; + return this; + } + + /** + * @param {Client} client + * @returns {Promise} + */ + async execute(client) { + const tokenRejectTxn = new TokenRejectTransaction() + .setTokenIds(this.tokenIds) + .setNftIds(this.nftIds); + + if (this.ownerId) { + tokenRejectTxn.setOwnerId(this.ownerId); + } + + this.fillOutTransaction(tokenRejectTxn); + + /* Get all token ids from NFT and remove duplicates as duplicated IDs + will trigger a TOKEN_REFERENCE_REPEATED error. */ + const nftTokenIds = this.nftIds + .map((nftId) => nftId.tokenId) + .filter(function (value, index, array) { + return array.indexOf(value) === index; + }); + + const tokenDissociateTxn = new TokenDissociateTransaction().setTokenIds( + [...this.tokenIds, ...nftTokenIds], + ); + + if (this.ownerId != null) { + tokenDissociateTxn.setAccountId(this.ownerId); + } + + this.fillOutTransaction(tokenDissociateTxn); + + const tokenRejectResponse = await tokenRejectTxn.execute(client); + await tokenRejectResponse.getReceipt(client); + + const tokenDissociateResponse = + await tokenDissociateTxn.execute(client); + await tokenDissociateResponse.getReceipt(client); + + return tokenRejectResponse; + } + + requireNotFrozen() { + if (this._freezeWithClient != null) { + throw new Error( + "Transaction is already frozen and cannot be modified", + ); + } + } +} diff --git a/src/token/TokenRejectTransaction.js b/src/token/TokenRejectTransaction.js new file mode 100644 index 000000000..9e5579714 --- /dev/null +++ b/src/token/TokenRejectTransaction.js @@ -0,0 +1,280 @@ +/*- + * ‌ + * Hedera JavaScript SDK + * ​ + * Copyright (C) 2020 - 2023 Hedera Hashgraph, LLC + * ​ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ‍ + */ +import AccountId from "../account/AccountId.js"; +import Transaction from "../transaction/Transaction.js"; +import { TRANSACTION_REGISTRY } from "../transaction/Transaction.js"; +import TokenReference from "../token/TokenReference.js"; + +/** + * @namespace proto + * @typedef {import("@hashgraph/proto").proto.ITransaction} HashgraphProto.proto.ITransaction + * @typedef {import("@hashgraph/proto").proto.ISignedTransaction} HashgraphProto.proto.ISignedTransaction + * @typedef {import("@hashgraph/proto").proto.ITransactionBody} HashgraphProto.proto.ITransactionBody + * @typedef {import("@hashgraph/proto").proto.ITransactionResponse} HashgraphProto.proto.ITransactionResponse + * @typedef {import("@hashgraph/proto").proto.TransactionBody} HashgraphProto.proto.TransactionBody + * @typedef {import("@hashgraph/proto").proto.ITokenRejectTransactionBody} HashgraphProto.proto.ITokenRejectTransactionBody + * @typedef {import("@hashgraph/proto").proto.TokenReference} HashgraphProto.proto.TokenReference + */ + +/** + * @typedef {import("../channel/Channel.js").default} Channel + * @typedef {import("../client/Client.js").default<*, *>} Client + * @typedef {import("../transaction/TransactionId.js").default} TransactionId + * @typedef {import("../token/TokenId.js").default} TokenId + * @typedef {import("../token/NftId.js").default} NftId + */ + +/** + * Reject a new Hedera™ crypto-currency token. + */ +export default class TokenRejectTransaction extends Transaction { + /** + * + * @param {object} [props] + * @param {?AccountId} [props.owner] + * @param {NftId[]} [props.nftIds] + * @param {TokenId[]} [props.tokenIds] + */ + constructor(props = {}) { + super(); + + /** + * @private + * @type {?AccountId} + */ + this._owner = null; + + if (props.owner != null) { + this.setOwnerId(props.owner); + } + + /** + * @private + * @type {TokenId[]} + */ + this._tokenIds = []; + + /** + * @private + * @type {NftId[]} + */ + this._nftIds = []; + + if (props.tokenIds != null) { + this.setTokenIds(props.tokenIds); + } + + if (props.nftIds != null) { + this.setNftIds(props.nftIds); + } + } + + /** + * @internal + * @param {HashgraphProto.proto.ITransaction[]} transactions + * @param {HashgraphProto.proto.ISignedTransaction[]} signedTransactions + * @param {TransactionId[]} transactionIds + * @param {AccountId[]} nodeIds + * @param {HashgraphProto.proto.ITransactionBody[]} bodies + * @returns {TokenRejectTransaction} + */ + static _fromProtobuf( + transactions, + signedTransactions, + transactionIds, + nodeIds, + bodies, + ) { + const body = bodies[0]; + const rejectToken = + /** @type {HashgraphProto.proto.ITokenRejectTransactionBody} */ ( + body.tokenReject + ); + + const tokenIds = rejectToken.rejections?.map((rejection) => + TokenReference._fromProtobuf(rejection), + ); + const ftIds = tokenIds + ?.filter((token) => token.fungibleToken) + .map(({ fungibleToken }) => { + if (fungibleToken == null) { + throw new Error("Fungible Token cannot be null"); + } + return fungibleToken; + }); + + const nftIds = tokenIds + ?.filter((token) => token.nft) + .map(({ nft }) => { + if (nft == null) { + throw new Error("Nft cannot be null"); + } + return nft; + }); + + return Transaction._fromProtobufTransactions( + new TokenRejectTransaction({ + owner: + rejectToken.owner != null + ? AccountId._fromProtobuf(rejectToken.owner) + : undefined, + + tokenIds: ftIds, + nftIds: nftIds, + }), + transactions, + signedTransactions, + transactionIds, + nodeIds, + bodies, + ); + } + + /** + * @returns {TokenId[]} + */ + get tokenIds() { + return this._tokenIds; + } + + /** + * @param {TokenId[]} tokenIds + * @returns {this} + */ + setTokenIds(tokenIds) { + this._requireNotFrozen(); + this._tokenIds = tokenIds; + return this; + } + + /** + * @param {TokenId} tokenId + * @returns {this} + */ + addTokenId(tokenId) { + this._requireNotFrozen(); + this._tokenIds?.push(tokenId); + return this; + } + + /** + * @returns {NftId[]} + * + */ + get nftIds() { + return this._nftIds; + } + + /** + * + * @param {NftId[]} nftIds + * @returns {this} + */ + setNftIds(nftIds) { + this._requireNotFrozen(); + this._nftIds = nftIds; + return this; + } + + /** + * @param {NftId} nftId + * @returns {this} + */ + addNftId(nftId) { + this._requireNotFrozen(); + this._nftIds?.push(nftId); + return this; + } + + /** + * @returns {?AccountId} + */ + get ownerId() { + return this._owner; + } + + /** + * @param {AccountId} owner + * @returns {this} + */ + setOwnerId(owner) { + this._requireNotFrozen(); + this._owner = owner; + return this; + } + + /** + * @override + * @internal + * @param {Channel} channel + * @param {HashgraphProto.proto.ITransaction} request + * @returns {Promise} + */ + _execute(channel, request) { + return channel.token.rejectToken(request); + } + + /** + * @override + * @protected + * @returns {NonNullable} + */ + _getTransactionDataCase() { + return "tokenReject"; + } + + /** + * @returns {HashgraphProto.proto.ITokenRejectTransactionBody} + */ + _makeTransactionData() { + /** @type {HashgraphProto.proto.TokenReference[]} */ + const rejections = []; + for (const tokenId of this._tokenIds) { + rejections.push({ + fungibleToken: tokenId._toProtobuf(), + }); + } + + for (const nftId of this._nftIds) { + rejections.push({ + nft: nftId._toProtobuf(), + }); + } + return { + owner: this.ownerId?._toProtobuf() ?? null, + rejections, + }; + } + + /** + * @returns {string} + */ + _getLogId() { + const timestamp = /** @type {import("../Timestamp.js").default} */ ( + this._transactionIds.current.validStart + ); + return `TokenRejectTransaction:${timestamp.toString()}`; + } +} +TRANSACTION_REGISTRY.set( + "tokenReject", + // eslint-disable-next-line @typescript-eslint/unbound-method + TokenRejectTransaction._fromProtobuf, +); diff --git a/src/transaction/Transaction.js b/src/transaction/Transaction.js index 5da957c23..e08a0d36e 100644 --- a/src/transaction/Transaction.js +++ b/src/transaction/Transaction.js @@ -1231,7 +1231,7 @@ export default class Transaction extends Executable { } /** - * Before we proceed exeuction, we need to do a couple checks + * Before we proceed execution, we need to do a couple checks * * @override * @protected @@ -1513,10 +1513,11 @@ export default class Transaction extends Executable { * @internal * @param {HashgraphProto.proto.ITransaction} request * @param {HashgraphProto.proto.ITransactionResponse} response + * @param {AccountId} nodeId * @returns {Error} */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - _mapStatusError(request, response) { + _mapStatusError(request, response, nodeId) { const { nodeTransactionPrecheckCode } = response; const status = Status._fromCode( @@ -1532,6 +1533,7 @@ export default class Transaction extends Executable { } return new PrecheckStatusError({ + nodeId, status, transactionId: this._getTransactionId(), contractFunctionResult: null, diff --git a/src/transaction/TransactionReceiptQuery.js b/src/transaction/TransactionReceiptQuery.js index 0f747eb91..07983ee4e 100644 --- a/src/transaction/TransactionReceiptQuery.js +++ b/src/transaction/TransactionReceiptQuery.js @@ -221,6 +221,7 @@ export default class TransactionReceiptQuery extends Query { case Status.Busy: case Status.Unknown: case Status.ReceiptNotFound: + case Status.PlatformNotActive: return [status, ExecutionState.Retry]; case Status.Ok: break; @@ -282,10 +283,11 @@ export default class TransactionReceiptQuery extends Query { * @internal * @param {HashgraphProto.proto.IQuery} request * @param {HashgraphProto.proto.IResponse} response + * @param {AccountId} nodeId * @returns {Error} */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - _mapStatusError(request, response) { + _mapStatusError(request, response, nodeId) { const { nodeTransactionPrecheckCode } = this._mapResponseHeader(response); @@ -302,6 +304,7 @@ export default class TransactionReceiptQuery extends Query { default: return new PrecheckStatusError({ + nodeId, status, transactionId: this._getTransactionId(), contractFunctionResult: null, diff --git a/src/transaction/TransactionRecordQuery.js b/src/transaction/TransactionRecordQuery.js index d4b677990..118371a0d 100644 --- a/src/transaction/TransactionRecordQuery.js +++ b/src/transaction/TransactionRecordQuery.js @@ -212,6 +212,7 @@ export default class TransactionRecordQuery extends Query { case Status.Unknown: case Status.ReceiptNotFound: case Status.RecordNotFound: + case Status.PlatformNotActive: return [status, ExecutionState.Retry]; case Status.Ok: @@ -281,10 +282,11 @@ export default class TransactionRecordQuery extends Query { * @internal * @param {HashgraphProto.proto.IQuery} request * @param {HashgraphProto.proto.IResponse} response + * @param {AccountId} nodeId * @returns {Error} */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - _mapStatusError(request, response) { + _mapStatusError(request, response, nodeId) { const { nodeTransactionPrecheckCode } = this._mapResponseHeader(response); @@ -311,6 +313,7 @@ export default class TransactionRecordQuery extends Query { default: return new PrecheckStatusError({ + nodeId, status, transactionId: this._getTransactionId(), contractFunctionResult: null, @@ -412,7 +415,6 @@ export default class TransactionRecordQuery extends Query { /** @type {HashgraphProto.proto.ITransactionGetRecordResponse} */ ( response.transactionGetRecord ); - return Promise.resolve(TransactionRecord._fromProtobuf(record)); } diff --git a/test/integration/TokenAssociateIntegrationTest.js b/test/integration/TokenAssociateIntegrationTest.js index 56bfe956b..5d31f007d 100644 --- a/test/integration/TokenAssociateIntegrationTest.js +++ b/test/integration/TokenAssociateIntegrationTest.js @@ -1,12 +1,19 @@ import { + AccountAllowanceApproveTransaction, AccountBalanceQuery, AccountCreateTransaction, - AccountInfoQuery, + AccountUpdateTransaction, Hbar, + NftId, + AccountInfoQuery, PrivateKey, Status, TokenAssociateTransaction, TokenCreateTransaction, + TokenMintTransaction, + TokenType, + TransactionId, + TransferTransaction, } from "../../src/exports.js"; import IntegrationTestEnv from "./client/NodeIntegrationTestEnv.js"; @@ -14,7 +21,7 @@ describe("TokenAssociate", function () { let env; before(async function () { - env = await IntegrationTestEnv.new(); + env = await IntegrationTestEnv.new({ balance: 1000 }); }); it("should be executable", async function () { @@ -129,6 +136,770 @@ describe("TokenAssociate", function () { } }); + describe("Max Auto Associations", function () { + let receiverKey, receiverId; + const TOKEN_SUPPLY = 100, + TRANSFER_AMOUNT = 10; + + beforeEach(async function () { + receiverKey = PrivateKey.generateECDSA(); + const receiverAccountCreateTx = await new AccountCreateTransaction() + .setKey(receiverKey) + .freezeWith(env.client) + .sign(receiverKey); + receiverId = ( + await ( + await receiverAccountCreateTx.execute(env.client) + ).getReceipt(env.client) + ).accountId; + }); + + describe("Limited Auto Associations", function () { + it("should revert FT transfer when no auto associations left", async function () { + this.timeout(120000); + // update account to have one auto association + const accountUpdateTx = await new AccountUpdateTransaction() + .setAccountId(receiverId) + .setMaxAutomaticTokenAssociations(1) + .freezeWith(env.client) + .sign(receiverKey); + + await ( + await accountUpdateTx.execute(env.client) + ).getReceipt(env.client); + + const tokenCreateTransaction = + await new TokenCreateTransaction() + .setTokenType(TokenType.FungibleCommon) + .setTokenName("FFFFF") + .setTokenSymbol("ffff") + .setInitialSupply(TOKEN_SUPPLY) + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setFreezeKey(env.operatorKey) + .setWipeKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId } = await tokenCreateTransaction.getReceipt( + env.client, + ); + + const tokenCreateTransaction2 = + await new TokenCreateTransaction() + .setTokenType(TokenType.FungibleCommon) + .setTokenName("FFFFF") + .setTokenSymbol("ffff") + .setInitialSupply(TOKEN_SUPPLY) + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setFreezeKey(env.operatorKey) + .setWipeKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId: tokenId2 } = + await tokenCreateTransaction2.getReceipt(env.client); + + const sendTokenToReceiverTx = await new TransferTransaction() + .addTokenTransfer(tokenId, env.operatorId, -TRANSFER_AMOUNT) + .addTokenTransfer(tokenId, receiverId, TRANSFER_AMOUNT) + .execute(env.client); + + await sendTokenToReceiverTx.getReceipt(env.client); + + const sendTokenToReceiverTx2 = await new TransferTransaction() + .addTokenTransfer( + tokenId2, + env.operatorId, + -TRANSFER_AMOUNT, + ) + .addTokenTransfer(tokenId2, receiverId, TRANSFER_AMOUNT) + .freezeWith(env.client) + .execute(env.client); + + let err = false; + + try { + await sendTokenToReceiverTx2.getReceipt(env.client); + } catch (error) { + err = error + .toString() + .includes(Status.NoRemainingAutomaticAssociations); + } + + if (!err) { + throw new Error( + "Token transfer did not error with NO_REMAINING_AUTOMATIC_ASSOCIATIONS", + ); + } + }); + + it("should revert NFTs transfer when no auto associations left", async function () { + this.timeout(120000); + const accountUpdateTx = await new AccountUpdateTransaction() + .setAccountId(receiverId) + .setMaxAutomaticTokenAssociations(1) + .freezeWith(env.client) + .sign(receiverKey); + + await ( + await accountUpdateTx.execute(env.client) + ).getReceipt(env.client); + + // create token 1 + const tokenCreateTransaction = + await new TokenCreateTransaction() + .setTokenType(TokenType.NonFungibleUnique) + .setTokenName("FFFFF") + .setTokenSymbol("ffff") + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId } = await tokenCreateTransaction.getReceipt( + env.client, + ); + + // mint a token in token 1 + const tokenMintSignedTransaction = + await new TokenMintTransaction() + .setTokenId(tokenId) + .setMetadata([Buffer.from("-")]) + .execute(env.client); + + const { serials } = await tokenMintSignedTransaction.getReceipt( + env.client, + ); + + // transfer the token to receiver + + const transferTxSign = await new TransferTransaction() + .addNftTransfer( + tokenId, + serials[0], + env.operatorId, + receiverId, + ) + .execute(env.client); + + await transferTxSign.getReceipt(env.client); + + // create token 2 + const tokenCreateTransaction2 = + await new TokenCreateTransaction() + .setTokenType(TokenType.NonFungibleUnique) + .setTokenName("FFFFF") + .setTokenSymbol("ffff") + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId: tokenId2 } = + await tokenCreateTransaction2.getReceipt(env.client); + + // mint token 2 + const tokenMintSignedTransaction2 = + await new TokenMintTransaction() + .setTokenId(tokenId2) + .addMetadata(Buffer.from("-")) + .execute(env.client); + + const serials2 = ( + await tokenMintSignedTransaction2.getReceipt(env.client) + ).serials; + + let err = false; + + try { + const transferToken2Response = + await new TransferTransaction() + .addNftTransfer( + tokenId2, + serials2[0], + env.operatorId, + receiverId, + ) + .execute(env.client); + + await transferToken2Response.getReceipt(env.client); + } catch (error) { + err = error + .toString() + .includes(Status.NoRemainingAutomaticAssociations); + } + + if (!err) { + throw new Error( + "Token transfer did not error with NO_REMAINING_AUTOMATIC_ASSOCIATIONS", + ); + } + }); + + it("should contain sent balance when transfering FT to account with manual token association", async function () { + this.timeout(120000); + const tokenCreateTransaction = + await new TokenCreateTransaction() + .setTokenType(TokenType.FungibleCommon) + .setTokenName("FFFFF") + .setTokenSymbol("ffff") + .setInitialSupply(TOKEN_SUPPLY) + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setFreezeKey(env.operatorKey) + .setWipeKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId } = await tokenCreateTransaction.getReceipt( + env.client, + ); + + const tokenAssociateTransaction = + await new TokenAssociateTransaction() + .setAccountId(receiverId) + .setTokenIds([tokenId]) + .freezeWith(env.client) + .sign(receiverKey); + + await ( + await tokenAssociateTransaction.execute(env.client) + ).getReceipt(env.client); + + const sendTokenToReceiverTx = await new TransferTransaction() + .addTokenTransfer(tokenId, env.operatorId, -TRANSFER_AMOUNT) + .addTokenTransfer(tokenId, receiverId, TRANSFER_AMOUNT) + .execute(env.client); + + await sendTokenToReceiverTx.getReceipt(env.client); + + const tokenBalance = await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client); + + expect(tokenBalance.tokens.get(tokenId).toInt()).to.be.equal( + TRANSFER_AMOUNT, + ); + }); + + it("should contain sent balance when transfering NFT to account with manual token association", async function () { + this.timeout(120000); + const tokenCreateTransaction = + await new TokenCreateTransaction() + .setTokenType(TokenType.NonFungibleUnique) + .setTokenName("FFFFF") + .setTokenSymbol("ffff") + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId } = await tokenCreateTransaction.getReceipt( + env.client, + ); + + const tokenAssociateTransaction = + await new TokenAssociateTransaction() + .setAccountId(receiverId) + .setTokenIds([tokenId]) + .freezeWith(env.client) + .sign(receiverKey); + + await ( + await tokenAssociateTransaction.execute(env.client) + ).getReceipt(env.client); + + const tokenMintTx = await new TokenMintTransaction() + .setTokenId(tokenId) + .setMetadata([Buffer.from("-")]) + .freezeWith(env.client) + .sign(env.operatorKey); + + const { serials } = await ( + await tokenMintTx.execute(env.client) + ).getReceipt(env.client); + + const sendTokenToReceiverTx = await new TransferTransaction() + .addNftTransfer( + tokenId, + serials[0], + env.operatorId, + receiverId, + ) + .execute(env.client); + + await sendTokenToReceiverTx.getReceipt(env.client); + + const tokenBalance = await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client); + + expect(tokenBalance.tokens.get(tokenId).toInt()).to.be.equal(1); + }); + }); + + describe("Unlimited Auto Associations", function () { + it("receiver should contain FTs when transfering to account with unlimited auto associations", async function () { + this.timeout(120000); + const tokenCreateResponse = await new TokenCreateTransaction() + .setTokenType(TokenType.FungibleCommon) + .setTokenName("ffff") + .setTokenSymbol("F") + .setInitialSupply(TOKEN_SUPPLY) + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setFreezeKey(env.operatorKey) + .setWipeKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId } = await tokenCreateResponse.getReceipt( + env.client, + ); + + const tokenCreateResponse2 = await new TokenCreateTransaction() + .setTokenType(TokenType.FungibleCommon) + .setTokenName("ffff") + .setTokenSymbol("F") + .setInitialSupply(TOKEN_SUPPLY) + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setFreezeKey(env.operatorKey) + .setWipeKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId: tokenId2 } = + await tokenCreateResponse2.getReceipt(env.client); + + const updateUnlimitedAutomaticAssociations = + await new AccountUpdateTransaction() + .setAccountId(receiverId) + .setMaxAutomaticTokenAssociations(-1) + .freezeWith(env.client) + .sign(receiverKey); + + await ( + await updateUnlimitedAutomaticAssociations.execute( + env.client, + ) + ).getReceipt(env.client); + + const tokenTransferResponse = await new TransferTransaction() + .addTokenTransfer(tokenId, env.operatorId, -TRANSFER_AMOUNT) + .addTokenTransfer(tokenId, receiverId, TRANSFER_AMOUNT) + .execute(env.client); + + await tokenTransferResponse.getReceipt(env.client); + + const tokenTransferResponse2 = await new TransferTransaction() + .addTokenTransfer( + tokenId2, + env.operatorId, + -TRANSFER_AMOUNT, + ) + .addTokenTransfer(tokenId2, receiverId, TRANSFER_AMOUNT) + .execute(env.client); + + await tokenTransferResponse2.getReceipt(env.client); + + const newTokenBalance = ( + await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client) + ).tokens.get(tokenId); + + const newTokenBalance2 = ( + await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client) + ).tokens.get(tokenId2); + + expect(newTokenBalance.toInt()).to.equal(TRANSFER_AMOUNT); + expect(newTokenBalance2.toInt()).to.equal(TRANSFER_AMOUNT); + }); + + it("receiver should contain NFTs when transfering to account with unlimited auto associations", async function () { + this.timeout(120000); + const tokenCreateResponse = await new TokenCreateTransaction() + .setTokenType(TokenType.NonFungibleUnique) + .setTokenName("ffff") + .setTokenSymbol("F") + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId } = await tokenCreateResponse.getReceipt( + env.client, + ); + + const tokenCreateResponse2 = await new TokenCreateTransaction() + .setTokenType(TokenType.NonFungibleUnique) + .setTokenName("ffff") + .setTokenSymbol("F") + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId: tokenId2 } = + await tokenCreateResponse2.getReceipt(env.client); + + const mintTokenTx = await new TokenMintTransaction() + .setTokenId(tokenId) + .setMetadata([Buffer.from("-")]) + .execute(env.client); + + const { serials } = await mintTokenTx.getReceipt(env.client); + + const mintTokenTx2 = await new TokenMintTransaction() + .setTokenId(tokenId2) + .setMetadata([Buffer.from("-")]) + .execute(env.client); + + await mintTokenTx2.getReceipt(env.client); + + const updateUnlimitedAutomaticAssociations = + await new AccountUpdateTransaction() + .setAccountId(receiverId) + .setMaxAutomaticTokenAssociations(-1) + .freezeWith(env.client) + .sign(receiverKey); + + await ( + await updateUnlimitedAutomaticAssociations.execute( + env.client, + ) + ).getReceipt(env.client); + + const tokenTransferResponse = await new TransferTransaction() + .addNftTransfer( + tokenId, + serials[0], + env.operatorId, + receiverId, + ) + .execute(env.client); + + await tokenTransferResponse.getReceipt(env.client); + + const tokenTransferResponse2 = await new TransferTransaction() + .addNftTransfer(tokenId2, 1, env.operatorId, receiverId) + .execute(env.client); + + await tokenTransferResponse2.getReceipt(env.client); + + const newTokenBalance = ( + await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client) + ).tokens.get(tokenId); + + const newTokenBalance2 = ( + await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client) + ).tokens.get(tokenId2); + + expect(newTokenBalance.toInt()).to.equal(1); + expect(newTokenBalance2.toInt()).to.equal(1); + }); + + it("receiver should have token balance even if it has given allowance to spender", async function () { + this.timeout(120000); + const spenderKey = PrivateKey.generateECDSA(); + const spenderAccountCreateTx = + await new AccountCreateTransaction() + .setKey(spenderKey) + .setMaxAutomaticTokenAssociations(-1) + .setInitialBalance(new Hbar(1)) + .execute(env.client); + + const spenderId = ( + await spenderAccountCreateTx.getReceipt(env.client) + ).accountId; + + const unlimitedAutoAssociationReceiverTx = + await new AccountUpdateTransaction() + .setAccountId(receiverId) + .setMaxAutomaticTokenAssociations(-1) + .freezeWith(env.client) + .sign(receiverKey); + + await ( + await unlimitedAutoAssociationReceiverTx.execute(env.client) + ).getReceipt(env.client); + + const tokenCreateResponse = await new TokenCreateTransaction() + .setTokenName("ffff") + .setTokenSymbol("F") + .setInitialSupply(TOKEN_SUPPLY) + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId } = await tokenCreateResponse.getReceipt( + env.client, + ); + + const tokenAllowanceTx = + await new AccountAllowanceApproveTransaction() + .approveTokenAllowance( + tokenId, + env.operatorId, + spenderId, + TRANSFER_AMOUNT, + ) + .execute(env.client); + + await tokenAllowanceTx.getReceipt(env.client); + + const onBehalfOfTransactionId = + TransactionId.generate(spenderId); + const tokenTransferApprovedSupply = + await new TransferTransaction() + .setTransactionId(onBehalfOfTransactionId) + .addApprovedTokenTransfer( + tokenId, + env.operatorId, + -TRANSFER_AMOUNT, + ) + .addTokenTransfer(tokenId, receiverId, TRANSFER_AMOUNT) + .freezeWith(env.client) + .sign(spenderKey); + + await ( + await tokenTransferApprovedSupply.execute(env.client) + ).getReceipt(env.client); + + const tokenBalanceReceiver = await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client); + + const tokenBalanceSpender = await new AccountBalanceQuery() + .setAccountId(spenderId) + .execute(env.client); + + const tokenBalanceTreasury = await new AccountBalanceQuery() + .setAccountId(env.operatorId) + .execute(env.client); + + expect( + tokenBalanceReceiver.tokens.get(tokenId).toInt(), + ).to.equal(TRANSFER_AMOUNT); + + expect(tokenBalanceSpender.tokens.get(tokenId)).to.equal(null); + + expect( + tokenBalanceTreasury.tokens.get(tokenId).toInt(), + ).to.equal(TOKEN_SUPPLY - TRANSFER_AMOUNT); + }); + + it("receiver should have nft even if it has given allowance to spender", async function () { + this.timeout(120000); + const spenderKey = PrivateKey.generateECDSA(); + + const unlimitedAutoAssociationReceiverTx = + await new AccountUpdateTransaction() + .setAccountId(receiverId) + .setMaxAutomaticTokenAssociations(-1) + .freezeWith(env.client) + .sign(receiverKey); + + await ( + await unlimitedAutoAssociationReceiverTx.execute(env.client) + ).getReceipt(env.client); + + const spenderAccountCreateTx = + await new AccountCreateTransaction() + .setKey(spenderKey) + .setInitialBalance(new Hbar(1)) + .setMaxAutomaticTokenAssociations(-1) + .execute(env.client); + + const spenderId = ( + await spenderAccountCreateTx.getReceipt(env.client) + ).accountId; + + const tokenCreateResponse = await new TokenCreateTransaction() + .setTokenName("ffff") + .setTokenSymbol("F") + .setTokenType(TokenType.NonFungibleUnique) + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId } = await tokenCreateResponse.getReceipt( + env.client, + ); + + await ( + await new TokenMintTransaction() + .setTokenId(tokenId) + .setMetadata([Buffer.from("-")]) + .execute(env.client) + ).getReceipt(env.client); + + const nftId = new NftId(tokenId, 1); + const nftAllowanceTx = + await new AccountAllowanceApproveTransaction() + .approveTokenNftAllowance( + nftId, + env.operatorId, + spenderId, + ) + .execute(env.client); + + await nftAllowanceTx.getReceipt(env.client); + + // Generate TransactionId from spender's account id in order + // for the transaction to be to be executed on behalf of the spender + const onBehalfOfTransactionId = + TransactionId.generate(spenderId); + + const nftTransferToReceiver = await new TransferTransaction() + .addApprovedNftTransfer(nftId, env.operatorId, receiverId) + .setTransactionId(onBehalfOfTransactionId) + .freezeWith(env.client) + .sign(spenderKey); + + await ( + await nftTransferToReceiver.execute(env.client) + ).getReceipt(env.client); + + const tokenBalanceReceiver = await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client); + + const tokenBalanceSpender = await new AccountBalanceQuery() + .setAccountId(spenderId) + .execute(env.client); + + const tokenBalanceTreasury = await new AccountBalanceQuery() + .setAccountId(env.operatorId) + .execute(env.client); + + expect( + tokenBalanceReceiver.tokens.get(tokenId).toInt(), + ).to.equal(1); + + expect(tokenBalanceSpender.tokens.get(tokenId)).to.equal(null); + + expect( + tokenBalanceTreasury.tokens.get(tokenId).toInt(), + ).to.equal(0); + }); + + it("receiver with unlimited auto associations should have FTs with decimal when sender transfers FTs", async function () { + const tokenCreateResponse = await new TokenCreateTransaction() + .setTokenType(TokenType.FungibleCommon) + .setTokenName("FFFFFFF") + .setTokenSymbol("fff") + .setDecimals(3) + .setInitialSupply(TOKEN_SUPPLY) + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setFreezeKey(env.operatorKey) + .setWipeKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId } = await tokenCreateResponse.getReceipt( + env.client, + ); + + const receiverKey = PrivateKey.generateECDSA(); + const receiverAccountResponse = + await new AccountCreateTransaction() + .setKey(receiverKey) + .setMaxAutomaticTokenAssociations(-1) + .setInitialBalance(new Hbar(1)) + .execute(env.client); + + const { accountId: receiverAccountId } = + await receiverAccountResponse.getReceipt(env.client); + + await ( + await new TokenAssociateTransaction() + .setAccountId(receiverAccountId) + .setTokenIds([tokenId]) + .freezeWith(env.client) + .sign(receiverKey) + ).execute(env.client); + + const tokenTransferResponse = await new TransferTransaction() + .addTokenTransfer(tokenId, env.operatorId, -TRANSFER_AMOUNT) + .addTokenTransfer( + tokenId, + receiverAccountId, + TRANSFER_AMOUNT, + ) + .execute(env.client); + + await tokenTransferResponse.getReceipt(env.client); + + const receiverBalance = ( + await new AccountBalanceQuery() + .setAccountId(receiverAccountId) + .execute(env.client) + ).tokens + .get(tokenId) + .toInt(); + + expect(receiverBalance).to.equal(TRANSFER_AMOUNT); + }); + + it("should revert when auto association is set to less than -1", async function () { + let err = false; + + try { + const accountUpdateTx = await new AccountUpdateTransaction() + .setAccountId(receiverId) + .setMaxAutomaticTokenAssociations(-2) + .freezeWith(env.client) + .sign(receiverKey); + await ( + await accountUpdateTx.execute(env.client) + ).getReceipt(env.client); + } catch (error) { + err = error + .toString() + .includes(Status.InvalidMaxAutoAssociations); + } + + if (!err) { + throw new Error("Token association did not error"); + } + + try { + const key = PrivateKey.generateECDSA(); + const accountCreateInvalidAutoAssociation = + await new AccountCreateTransaction() + .setKey(key) + .setMaxAutomaticTokenAssociations(-2) + .execute(env.client); + + await accountCreateInvalidAutoAssociation.getReceipt( + env.client, + ); + } catch (error) { + err = error + .toString() + .includes(Status.InvalidMaxAutoAssociations); + } + + if (!err) { + throw new Error("Token association did not error"); + } + }); + }); + }); + after(async function () { await env.close(); }); diff --git a/test/integration/TokenRejectFlowIntegrationTest.js b/test/integration/TokenRejectFlowIntegrationTest.js new file mode 100644 index 000000000..83ab17586 --- /dev/null +++ b/test/integration/TokenRejectFlowIntegrationTest.js @@ -0,0 +1,209 @@ +import { + AccountBalanceQuery, + AccountCreateTransaction, + Hbar, + NftId, + PrivateKey, + TokenAssociateTransaction, + TokenCreateTransaction, + TokenMintTransaction, + TokenRejectFlow, + TokenType, + TransferTransaction, +} from "../../src/exports.js"; +import IntegrationTestEnv from "./client/NodeIntegrationTestEnv.js"; + +describe("TokenRejectIntegrationTest", function () { + let env; + it("can execute TokenRejectFlow for fungible tokens", async function () { + this.timeout(120000); + env = await IntegrationTestEnv.new(); + const FULL_TREASURY_BALANCE = 1000000; + + // create token + const tokenCreateTx = await new TokenCreateTransaction() + .setTokenName("ffff") + .setTokenSymbol("F") + .setDecimals(3) + .setInitialSupply(FULL_TREASURY_BALANCE) + .setTreasuryAccountId(env.operatorId) + .setPauseKey(env.operatorKey) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + let tokenId1 = (await tokenCreateTx.getReceipt(env.client)).tokenId; + + // create token + const tokenCreateTx2 = await new TokenCreateTransaction() + .setTokenName("ffff") + .setTokenSymbol("F") + .setDecimals(3) + .setInitialSupply(1000000) + .setTreasuryAccountId(env.operatorId) + .setPauseKey(env.operatorKey) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + let tokenId2 = (await tokenCreateTx2.getReceipt(env.client)).tokenId; + // create receiver account + let receiverPrivateKey = await PrivateKey.generateECDSA(); + const receiverCreateAccount = await new AccountCreateTransaction() + .setKey(receiverPrivateKey) + .setInitialBalance(new Hbar(1)) + .execute(env.client); + + let receiverId = (await receiverCreateAccount.getReceipt(env.client)) + .accountId; + + await ( + await new TokenAssociateTransaction() + .setAccountId(receiverId) + .setTokenIds([tokenId1, tokenId2]) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client); + + await ( + await new TransferTransaction() + .addTokenTransfer(tokenId1, env.operatorId, -100) + .addTokenTransfer(tokenId1, receiverId, 100) + .addTokenTransfer(tokenId2, env.operatorId, -100) + .addTokenTransfer(tokenId2, receiverId, 100) + .execute(env.client) + ).getReceipt(env.client); + + await ( + await new TokenRejectFlow() + .setOwnerId(receiverId) + .setTokenIds([tokenId1, tokenId2]) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client); + + const receiverBalanceQuery = await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client); + + const treasuryBalanceQuery = await new AccountBalanceQuery() + .setAccountId(env.operatorId) + .execute(env.client); + + expect(receiverBalanceQuery.tokens.get(tokenId1)).to.be.eq(null); + expect(receiverBalanceQuery.tokens.get(tokenId2)).to.be.eq(null); + expect(treasuryBalanceQuery.tokens.get(tokenId1).toInt()).to.be.eq( + FULL_TREASURY_BALANCE, + ); + expect(treasuryBalanceQuery.tokens.get(tokenId2).toInt()).to.be.eq( + FULL_TREASURY_BALANCE, + ); + + let err; + try { + await ( + await new TransferTransaction() + .addTokenTransfer(tokenId1, receiverId, 100) + .addTokenTransfer(tokenId1, env.operatorId, -100) + .execute(env.client) + ).getReceipt(env.client); + } catch (error) { + err = error.message.includes("TOKEN_NOT_ASSOCIATED_TO_ACCOUNT"); + } + + if (!err) { + throw new Error( + "Token should not be associated with receiver account", + ); + } + }); + + it("can execute TokenRejectFlow for non-fungible tokens", async function () { + this.timeout(120000); + env = await IntegrationTestEnv.new(); + + // create token + const tokenCreateTx = await new TokenCreateTransaction() + .setTokenType(TokenType.NonFungibleUnique) + .setTokenName("ffff") + .setTokenSymbol("F") + .setTreasuryAccountId(env.operatorId) + .setPauseKey(env.operatorKey) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + let { tokenId } = await tokenCreateTx.getReceipt(env.client); + + // create receiver account + let receiverPrivateKey = await PrivateKey.generateECDSA(); + const receiverCreateAccount = await new AccountCreateTransaction() + .setKey(receiverPrivateKey) + .setInitialBalance(new Hbar(1)) + .execute(env.client); + + let { accountId: receiverId } = await receiverCreateAccount.getReceipt( + env.client, + ); + + await ( + await new TokenAssociateTransaction() + .setAccountId(receiverId) + .setTokenIds([tokenId]) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client); + + await new TokenMintTransaction() + .setTokenId(tokenId) + .addMetadata(Buffer.from("=====")) + .execute(env.client); + + const nftId = new NftId(tokenId, 1); + await ( + await new TransferTransaction() + .addNftTransfer(nftId, env.operatorId, receiverId) + .execute(env.client) + ).getReceipt(env.client); + + await ( + await new TokenRejectFlow() + .setOwnerId(receiverId) + .setNftIds([nftId]) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client); + + const receiverBalanceQuery = await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client); + + const treasuryBalanceQuery = await new AccountBalanceQuery() + .setAccountId(env.operatorId) + .execute(env.client); + + expect(receiverBalanceQuery.tokens.get(tokenId)).to.eq(null); + expect(treasuryBalanceQuery.tokens.get(tokenId).toInt()).to.be.eq(1); + + let err; + try { + await ( + await new TransferTransaction() + .addNftTransfer(nftId, env.operatorId, receiverId) + .execute(env.client) + ).getReceipt(env.client); + } catch (error) { + err = error.message.includes("TOKEN_NOT_ASSOCIATED_TO_ACCOUNT"); + } + + if (!err) { + throw new Error( + "Token should not be associated with receiver account", + ); + } + }); + + after(async function () { + await env.close(); + }); +}); diff --git a/test/integration/TokenRejectIntegrationTest.js b/test/integration/TokenRejectIntegrationTest.js new file mode 100644 index 000000000..f08298bcc --- /dev/null +++ b/test/integration/TokenRejectIntegrationTest.js @@ -0,0 +1,1005 @@ +import { expect } from "chai"; +import { + AccountAllowanceApproveTransaction, + AccountBalanceQuery, + AccountCreateTransaction, + AccountUpdateTransaction, + Hbar, + NftId, + PrivateKey, + TokenCreateTransaction, + TokenFreezeTransaction, + TokenMintTransaction, + TokenPauseTransaction, + TokenRejectTransaction, + TokenType, + TransactionId, + TransferTransaction, +} from "../../src/exports.js"; +import IntegrationTestEnv from "./client/NodeIntegrationTestEnv.js"; + +describe("TokenRejectIntegrationTest", function () { + let env, tokenId, receiverId, receiverPrivateKey; + const INITIAL_SUPPLY = 1000000; + + describe("Fungible Tokens", function () { + beforeEach(async function () { + env = await IntegrationTestEnv.new(); + + // create token + const tokenCreateResponse = await new TokenCreateTransaction() + .setTokenName("ffff") + .setTokenSymbol("F") + .setDecimals(3) + .setInitialSupply(INITIAL_SUPPLY) + .setTreasuryAccountId(env.operatorId) + .setPauseKey(env.operatorKey) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .setFreezeKey(env.operatorKey) + .execute(env.client); + + tokenId = (await tokenCreateResponse.getReceipt(env.client)) + .tokenId; + + // create receiver account + receiverPrivateKey = await PrivateKey.generateECDSA(); + const receiverCreateAccount = await new AccountCreateTransaction() + .setKey(receiverPrivateKey) + .setInitialBalance(new Hbar(1)) + .setMaxAutomaticTokenAssociations(-1) + .execute(env.client); + + receiverId = (await receiverCreateAccount.getReceipt(env.client)) + .accountId; + }); + + it("should execute TokenReject Tx", async function () { + this.timeout(120000); + + // create another token + const tokenCreateResponse2 = await new TokenCreateTransaction() + .setTokenName("ffff2") + .setTokenSymbol("F2") + .setDecimals(3) + .setInitialSupply(INITIAL_SUPPLY) + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId: tokenId2 } = await tokenCreateResponse2.getReceipt( + env.client, + ); + + // transfer tokens of both types to receiver + await ( + await new TransferTransaction() + .addTokenTransfer(tokenId, env.operatorId, -1) + .addTokenTransfer(tokenId, receiverId, 1) + .addTokenTransfer(tokenId2, env.operatorId, -1) + .addTokenTransfer(tokenId2, receiverId, 1) + .execute(env.client) + ).getReceipt(env.client); + + // reject tokens + await ( + await ( + await new TokenRejectTransaction() + .setTokenIds([tokenId, tokenId2]) + .setOwnerId(receiverId) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + + const tokenBalanceReceiverQuery = await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client); + + const tokenBalanceReceiver = tokenBalanceReceiverQuery.tokens + .get(tokenId) + .toInt(); + const tokenBalanceReceiver2 = tokenBalanceReceiverQuery.tokens + .get(tokenId2) + .toInt(); + + const tokenBalanceTreasuryQuery = await new AccountBalanceQuery() + .setAccountId(env.operatorId) + .execute(env.client); + + const tokenBalanceTreasury = tokenBalanceTreasuryQuery.tokens + .get(tokenId) + .toInt(); + const tokenBalanceTreasury2 = tokenBalanceTreasuryQuery.tokens + .get(tokenId) + .toInt(); + + expect(tokenBalanceReceiver).to.be.equal(0); + expect(tokenBalanceReceiver2).to.be.equal(0); + + expect(tokenBalanceTreasury).to.be.equal(INITIAL_SUPPLY); + expect(tokenBalanceTreasury2).to.be.equal(INITIAL_SUPPLY); + }); + + it("should return token back when receiver has receiverSigRequired is true", async function () { + this.timeout(120000); + const TREASURY_TOKENS_AMOUNT = 1000000; + + await new AccountUpdateTransaction() + .setAccountId(env.operatorId) + .setReceiverSignatureRequired(true) + .execute(env.client); + + const transferTransactionResponse = await new TransferTransaction() + .addTokenTransfer(tokenId, env.operatorId, -1) + .addTokenTransfer(tokenId, receiverId, 1) + .execute(env.client); + + await transferTransactionResponse.getReceipt(env.client); + + const tokenRejectResponse = await ( + await new TokenRejectTransaction() + .addTokenId(tokenId) + .setOwnerId(receiverId) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client); + + await tokenRejectResponse.getReceipt(env.client); + + const tokenBalanceTreasuryQuery = await new AccountBalanceQuery() + .setAccountId(env.operatorId) + .execute(env.client); + + const tokenBalanceTreasury = tokenBalanceTreasuryQuery.tokens + .get(tokenId) + .toInt(); + expect(tokenBalanceTreasury).to.be.equal(TREASURY_TOKENS_AMOUNT); + + const tokenBalanceReceiverQuery = await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client); + const tokenBalanceReceiver = tokenBalanceReceiverQuery.tokens + .get(tokenId) + .toInt(); + expect(tokenBalanceReceiver).to.equal(0); + }); + + // temporary disabled until issue re nfts will be resolved on services side + // eslint-disable-next-line mocha/no-skipped-tests + it.skip("should not return spender allowance to zero after owner rejects FT", async function () { + this.timeout(120000); + + const spenderAccountPrivateKey = PrivateKey.generateED25519(); + const spenderAccountResponse = await new AccountCreateTransaction() + .setMaxAutomaticTokenAssociations(-1) + .setInitialBalance(new Hbar(10)) + .setKey(spenderAccountPrivateKey) + .execute(env.client); + + const { accountId: spenderAccountId } = + await spenderAccountResponse.getReceipt(env.client); + + await ( + await new TransferTransaction() + .addTokenTransfer(tokenId, env.operatorId, -1) + .addTokenTransfer(tokenId, receiverId, 1) + .execute(env.client) + ).getReceipt(env.client); + + await ( + await ( + await new AccountAllowanceApproveTransaction() + .approveTokenAllowance( + tokenId, + receiverId, + spenderAccountId, + 10, + ) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + + await ( + await ( + await new TokenRejectTransaction() + .addTokenId(tokenId) + .setOwnerId(receiverId) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + + // Confirm that token reject transaction has returned funds + const balanceReceiverPre = await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client); + + const balanceTreasuryPre = await new AccountBalanceQuery() + .setAccountId(env.operatorId) + .execute(env.client); + + expect(balanceReceiverPre.tokens.get(tokenId).toInt()).to.eq(0); + expect(balanceTreasuryPre.tokens.get(tokenId).toInt()).to.eq( + INITIAL_SUPPLY, + ); + + // after token reject transaction receiver doesn't have balance + // so we need some tokens back from treasury + await ( + await new TransferTransaction() + .addTokenTransfer(tokenId, env.operatorId, -1) + .addTokenTransfer(tokenId, receiverId, 1) + .execute(env.client) + ).getReceipt(env.client); + + const transactionId = TransactionId.generate(spenderAccountId); + await ( + await ( + await new TransferTransaction() + .addApprovedTokenTransfer(tokenId, receiverId, -1) + .addTokenTransfer(tokenId, spenderAccountId, 1) + .setTransactionId(transactionId) + .freezeWith(env.client) + .sign(spenderAccountPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + + // Confirm spender has transfered tokens + const tokenBalanceReceiverPost = await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client); + + expect(tokenBalanceReceiverPost.tokens.get(tokenId).toInt()).to.eq( + 0, + ); + + const tokenBalanceSpenderPost = await new AccountBalanceQuery() + .setAccountId(spenderAccountId) + .execute(env.client); + + expect(tokenBalanceSpenderPost.tokens.get(tokenId).toInt()).to.eq( + 1, + ); + }); + + describe("should throw an error", function () { + it("when paused FT", async function () { + this.timeout(120000); + + await ( + await new TokenPauseTransaction() + .setTokenId(tokenId) + .execute(env.client) + ).getReceipt(env.client); + + await new TransferTransaction() + .addTokenTransfer(tokenId, env.operatorId, -1) + .addTokenTransfer(tokenId, receiverId, 1) + .execute(env.client); + + const tokenRejectTx = await new TokenRejectTransaction() + .addTokenId(tokenId) + .setOwnerId(receiverId) + .freezeWith(env.client) + .sign(receiverPrivateKey); + + try { + await ( + await tokenRejectTx.execute(env.client) + ).getReceipt(env.client); + } catch (err) { + expect(err.message).to.include("TOKEN_IS_PAUSED"); + } + }); + + it("when FT is frozen", async function () { + this.timeout(120000); + // transfer token to receiver + await new TransferTransaction() + .addTokenTransfer(tokenId, env.operatorId, -1) + .addTokenTransfer(tokenId, receiverId, 1) + .execute(env.client); + + // freeze token + await ( + await new TokenFreezeTransaction() + .setTokenId(tokenId) + .setAccountId(receiverId) + .execute(env.client) + ).getReceipt(env.client); + + try { + // reject token on frozen account for thsi token + await ( + await ( + await new TokenRejectTransaction() + .addTokenId(tokenId) + .setOwnerId(receiverId) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + } catch (err) { + expect(err.message).to.include("ACCOUNT_FROZEN_FOR_TOKEN"); + } + }); + + it("when there's a duplicated token reference", async function () { + await ( + await new TransferTransaction() + .addTokenTransfer(tokenId, env.operatorId, -1) + .addTokenTransfer(tokenId, receiverId, 1) + .execute(env.client) + ).getReceipt(env.client); + + try { + await new TokenRejectTransaction() + .setTokenIds([tokenId, tokenId]) + .execute(env.client); + } catch (err) { + expect(err.message).to.include("TOKEN_REFERENCE_REPEATED"); + } + }); + + it("when user does not have balance", async function () { + this.timeout(120000); + + // create receiver account + const receiverPrivateKey = PrivateKey.generateED25519(); + const { accountId: emptyBalanceUserId } = await ( + await new AccountCreateTransaction() + .setKey(receiverPrivateKey) + .setMaxAutomaticTokenAssociations(-1) + .execute(env.client) + ).getReceipt(env.client); + + await ( + await new TransferTransaction() + .addTokenTransfer(tokenId, env.operatorId, -1000) + .addTokenTransfer(tokenId, receiverId, 1000) + .execute(env.client) + ).getReceipt(env.client); + + const transactionId = + await TransactionId.generate(emptyBalanceUserId); + try { + await ( + await ( + await new TokenRejectTransaction() + .setOwnerId(emptyBalanceUserId) + .addTokenId(tokenId) + .setTransactionId(transactionId) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + } catch (err) { + expect(err.message).to.include( + "INSUFFICIENT_PAYER_BALANCE", + ); + } + }); + + it("when trasury account rejects token", async function () { + try { + await ( + await new TokenRejectTransaction() + .addTokenId(tokenId) + .execute(env.client) + ).getReceipt(env.client); + } catch (err) { + expect(err.message).to.include("ACCOUNT_IS_TREASURY"); + } + }); + + it("when more than 11 tokens in token list for RejectToken transaction", async function () { + this.timeout(120000); + const tokenIds = []; + + for (let i = 0; i < 11; i++) { + const { tokenId } = await ( + await new TokenCreateTransaction() + .setTokenName("ffff") + .setTokenSymbol("F") + .setTokenType(TokenType.FungibleCommon) + .setInitialSupply(1000) + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client) + ).getReceipt(env.client); + tokenIds.push(tokenId); + } + try { + await ( + await new TokenRejectTransaction() + .setTokenIds(tokenIds) + .execute(env.client) + ).getReceipt(env.client); + } catch (err) { + expect(err.message).to.include( + "TOKEN_REFERENCE_LIST_SIZE_LIMIT_EXCEEDED", + ); + } + }); + }); + }); + + describe("Non-Fungible Tokens", function () { + let tokenId, receiverPrivateKey, receiverId, nftId; + beforeEach(async function () { + this.timeout(120000); + env = await IntegrationTestEnv.new(); + const tokenCreateResponse = await new TokenCreateTransaction() + .setTokenType(TokenType.NonFungibleUnique) + .setTokenName("ffff") + .setTokenSymbol("F") + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .setPauseKey(env.operatorKey) + .setFreezeKey(env.operatorKey) + .execute(env.client); + + tokenId = (await tokenCreateResponse.getReceipt(env.client)) + .tokenId; + + receiverPrivateKey = await PrivateKey.generateECDSA(); + receiverId = ( + await ( + await new AccountCreateTransaction() + .setKey(receiverPrivateKey) + .setMaxAutomaticTokenAssociations(-1) + .execute(env.client) + ).getReceipt(env.client) + ).accountId; + + nftId = new NftId(tokenId, 1); + await ( + await new TokenMintTransaction() + .setTokenId(tokenId) + .setMetadata(Buffer.from("-")) + .execute(env.client) + ).getReceipt(env.client); + }); + + it("should execute TokenReject Tx", async function () { + this.timeout(120000); + + const tokenCreateResponse2 = await new TokenCreateTransaction() + .setTokenType(TokenType.NonFungibleUnique) + .setTokenName("ffff2") + .setTokenSymbol("F2") + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + const { tokenId: tokenId2 } = await tokenCreateResponse2.getReceipt( + env.client, + ); + + const nftId2 = new NftId(tokenId2, 1); + await ( + await new TokenMintTransaction() + .setTokenId(tokenId2) + .setMetadata(Buffer.from("-")) + .execute(env.client) + ).getReceipt(env.client); + + await ( + await new TransferTransaction() + .addNftTransfer(nftId, env.operatorId, receiverId) + .addNftTransfer(nftId2, env.operatorId, receiverId) + .execute(env.client) + ).getReceipt(env.client); + + await ( + await ( + await await new TokenRejectTransaction() + .setNftIds([nftId, nftId2]) + .setOwnerId(receiverId) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + + const tokenBalanceReceiverQuery = await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client); + + const tokenBalanceTreasuryQuery = await new AccountBalanceQuery() + .setAccountId(env.operatorId) + .execute(env.client); + + const tokenBalanceReceiver = tokenBalanceReceiverQuery.tokens + .get(tokenId) + .toInt(); + const tokenBalanceReceiver2 = tokenBalanceReceiverQuery.tokens + .get(tokenId2) + .toInt(); + + const tokenBalanceTreasury = tokenBalanceTreasuryQuery.tokens + .get(tokenId) + .toInt(); + const tokenBalanceTreasury2 = tokenBalanceTreasuryQuery.tokens + .get(tokenId2) + .toInt(); + + expect(tokenBalanceTreasury).to.be.equal(1); + expect(tokenBalanceTreasury2).to.be.equal(1); + + expect(tokenBalanceReceiver).to.be.equal(0); + expect(tokenBalanceReceiver2).to.be.equal(0); + }); + + it("should return tokens back to treasury receiverSigRequired is true", async function () { + this.timeout(1200000); + + await new AccountUpdateTransaction() + .setAccountId(env.operatorId) + .setReceiverSignatureRequired(true) + .execute(env.client); + + const transferTransactionResponse = await new TransferTransaction() + .addNftTransfer(nftId, env.operatorId, receiverId) + .freezeWith(env.client) + .execute(env.client); + + await transferTransactionResponse.getReceipt(env.client); + + const tokenRejectResponse = await ( + await new TokenRejectTransaction() + .addNftId(nftId) + .setOwnerId(receiverId) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client); + + await tokenRejectResponse.getReceipt(env.client); + + const tokenBalanceTreasuryQuery = await new AccountBalanceQuery() + .setAccountId(env.operatorId) + .execute(env.client); + + const tokenBalanceTreasury = tokenBalanceTreasuryQuery.tokens + .get(tokenId) + .toInt(); + expect(tokenBalanceTreasury).to.be.equal(1); + + const tokenBalanceReceiverQuery = await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client); + + const tokenBalanceReceiver = tokenBalanceReceiverQuery.tokens + .get(tokenId) + .toInt(); + expect(tokenBalanceReceiver).to.equal(0); + }); + + // temporary disabled until issue re nfts will be resolved on services side + // eslint-disable-next-line mocha/no-skipped-tests + it.skip("should return spender allowance to 0 after owner rejects NFT", async function () { + this.timeout(120000); + + // create spender account + const spenderAccountPrivateKey = PrivateKey.generateED25519(); + const spenderAccountResponse = await new AccountCreateTransaction() + .setMaxAutomaticTokenAssociations(-1) + .setInitialBalance(new Hbar(10)) + .setKey(spenderAccountPrivateKey) + .execute(env.client); + + const { accountId: spenderAccountId } = + await spenderAccountResponse.getReceipt(env.client); + + // transfer nft to receiver + await ( + await new TransferTransaction() + .addNftTransfer(nftId, env.operatorId, receiverId) + .execute(env.client) + ).getReceipt(env.client); + + // approve nft allowance + await ( + await ( + await new AccountAllowanceApproveTransaction() + .approveTokenNftAllowance( + nftId, + receiverId, + spenderAccountId, + ) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + + // reject nft + await ( + await ( + await new TokenRejectTransaction() + .addNftId(nftId) + .setOwnerId(receiverId) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + + // transfer nft from receiver to spender using allowance + try { + const transactionId = TransactionId.generate(spenderAccountId); + await ( + await ( + await new TransferTransaction() + .addApprovedNftTransfer( + nftId, + receiverId, + spenderAccountId, + ) + .setTransactionId(transactionId) + .freezeWith(env.client) + .sign(spenderAccountPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + } catch (err) { + expect(err.message).to.include( + "SPENDER_DOES_NOT_HAVE_ALLOWANCE", + ); + } + }); + + describe("should throw an error", function () { + it("when paused NFT", async function () { + this.timeout(120000); + + await ( + await new TokenPauseTransaction() + .setTokenId(tokenId) + .execute(env.client) + ).getReceipt(env.client); + + await new TransferTransaction() + .addNftTransfer(nftId, env.operatorId, receiverId) + .execute(env.client); + const tokenRejectTx = await new TokenRejectTransaction() + .addTokenId(tokenId) + .setOwnerId(receiverId) + .freezeWith(env.client) + .sign(receiverPrivateKey); + + try { + await ( + await tokenRejectTx.execute(env.client) + ).getReceipt(env.client); + } catch (err) { + expect(err.message).to.include("TOKEN_IS_PAUSED"); + } + }); + + it("when NFT is frozen", async function () { + this.timeout(120000); + + // transfer token to receiver + await new TransferTransaction() + .addNftTransfer(nftId, env.operatorId, receiverId) + .execute(env.client); + + // freeze token + await ( + await new TokenFreezeTransaction() + .setTokenId(tokenId) + .setAccountId(receiverId) + .execute(env.client) + ).getReceipt(env.client); + + try { + // reject token on frozen account for thsi token + await ( + await ( + await new TokenRejectTransaction() + .addTokenId(tokenId) + .setOwnerId(receiverId) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + } catch (err) { + expect(err.message).to.include("ACCOUNT_FROZEN_FOR_TOKEN"); + } + }); + + it("when using Fungible Token id when referencing NFTs", async function () { + this.timeout(120000); + + // transfer to receiver + await ( + await new TransferTransaction() + .addNftTransfer(nftId, env.operatorId, receiverId) + .execute(env.client) + ).getReceipt(env.client); + + try { + // reject nft using addTokenId + await ( + await ( + await new TokenRejectTransaction() + .setOwnerId(receiverId) + .addTokenId(tokenId) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + } catch (err) { + expect(err.message).to.include( + "ACCOUNT_AMOUNT_TRANSFERS_ONLY_ALLOWED_FOR_FUNGIBLE_COMMON", + ); + } + + try { + // reject nft using setTokenIds + await ( + await ( + await new TokenRejectTransaction() + .setOwnerId(receiverId) + .setTokenIds([tokenId]) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + } catch (err) { + expect(err.message).to.include( + "ACCOUNT_AMOUNT_TRANSFERS_ONLY_ALLOWED_FOR_FUNGIBLE_COMMON", + ); + } + }); + + it("when there's a duplicated token reference", async function () { + this.timeout(120000); + + // transfer nft to receiver + await ( + await new TransferTransaction() + .addNftTransfer(nftId, env.operatorId, receiverId) + .execute(env.client) + ).getReceipt(env.client); + + // reject nft + try { + await new TokenRejectTransaction() + .setNftIds([nftId, nftId]) + .execute(env.client); + } catch (err) { + expect(err.message).to.include("TOKEN_REFERENCE_REPEATED"); + } + }); + + it("when user does not have balance", async function () { + this.timeout(120000); + + // transfer nft to receiver + await ( + await new TransferTransaction() + .addNftTransfer(nftId, env.operatorId, receiverId) + .execute(env.client) + ).getReceipt(env.client); + const transactionId = await TransactionId.generate(receiverId); + + try { + // reject nft + await ( + await ( + await new TokenRejectTransaction() + .setOwnerId(receiverId) + .addNftId(nftId) + .setTransactionId(transactionId) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + } catch (err) { + expect(err.message).to.include( + "INSUFFICIENT_PAYER_BALANCE", + ); + } + }); + + it("when wrong signature of owner", async function () { + // transfer token to receiver + await new TransferTransaction() + .addTokenTransfer(tokenId, env.operatorId, -1000) + .addTokenTransfer(tokenId, receiverId, 1000); + + try { + // reject token with wrong signature + const WRONG_SIGNATURE = PrivateKey.generateED25519(); + await ( + await ( + await new TokenRejectTransaction() + .addTokenId(tokenId) + .setOwnerId(receiverId) + .freezeWith(env.client) + .sign(WRONG_SIGNATURE) + ).execute(env.client) + ).getReceipt(env.client); + } catch (err) { + expect(err.message).to.include("INVALID_SIGNATURE"); + } + }); + + it("when wrong owner id", async function () { + this.timeout(120000); + + // generate wrong owner account + const wrongOwnerPrivateKey = PrivateKey.generateED25519(); + const { accountId: wrongOwnerId } = await ( + await new AccountCreateTransaction() + .setKey(wrongOwnerPrivateKey) + .setMaxAutomaticTokenAssociations(-1) + .execute(env.client) + ).getReceipt(env.client); + + // transfer token to receiver + await ( + await new TransferTransaction() + .addNftTransfer(nftId, env.operatorId, receiverId) + .execute(env.client) + ).getReceipt(env.client); + + try { + // reject token with wrong token id + await ( + await ( + await new TokenRejectTransaction() + .addNftId(nftId) + .setOwnerId(wrongOwnerId) + .freezeWith(env.client) + .sign(wrongOwnerPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + } catch (err) { + expect(err.message).to.include("INVALID_OWNER_ID"); + } + }); + }); + }); + + describe("Other", function () { + beforeEach(async function () { + env = await IntegrationTestEnv.new(); + + // create token + const tokenCreateResponse = await new TokenCreateTransaction() + .setTokenName("ffff") + .setTokenSymbol("F") + .setDecimals(3) + .setInitialSupply(1000000) + .setTreasuryAccountId(env.operatorId) + .setPauseKey(env.operatorKey) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + + tokenId = (await tokenCreateResponse.getReceipt(env.client)) + .tokenId; + + // create receiver account + receiverPrivateKey = await PrivateKey.generateECDSA(); + const receiverCreateAccountResponse = + await new AccountCreateTransaction() + .setKey(receiverPrivateKey) + .setInitialBalance(new Hbar(1)) + .setMaxAutomaticTokenAssociations(-1) + .execute(env.client); + + receiverId = ( + await receiverCreateAccountResponse.getReceipt(env.client) + ).accountId; + }); + + it("should execute TokenReject tx with mixed type of tokens in one tx", async function () { + this.timeout(120000); + + // create NFT collection + const tokenCreateResponse = await new TokenCreateTransaction() + .setTokenType(TokenType.NonFungibleUnique) + .setTokenName("ffff") + .setTokenSymbol("F") + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + const { tokenId: nftId } = await tokenCreateResponse.getReceipt( + env.client, + ); + const nftSerialId = new NftId(nftId, 1); + + // create FT + const tokenCreateResponse2 = await new TokenCreateTransaction() + .setTokenName("ffff2") + .setTokenSymbol("F2") + .setDecimals(3) + .setInitialSupply(1000000) + .setTreasuryAccountId(env.operatorId) + .setAdminKey(env.operatorKey) + .setSupplyKey(env.operatorKey) + .execute(env.client); + const { tokenId: ftId } = await tokenCreateResponse2.getReceipt( + env.client, + ); + + await ( + await new TokenMintTransaction() + .setTokenId(nftId) + .setMetadata(Buffer.from("-")) + .execute(env.client) + ).getReceipt(env.client); + + const tokenTransferResponse = await new TransferTransaction() + .addTokenTransfer(ftId, env.operatorId, -1) + .addTokenTransfer(ftId, receiverId, 1) + .addNftTransfer(nftSerialId, env.operatorId, receiverId) + .execute(env.client); + + await tokenTransferResponse.getReceipt(env.client); + + // reject tokens + await ( + await ( + await new TokenRejectTransaction() + .addTokenId(ftId) + .addNftId(nftSerialId) + .setOwnerId(receiverId) + .freezeWith(env.client) + .sign(receiverPrivateKey) + ).execute(env.client) + ).getReceipt(env.client); + + // check token balance of receiver + const tokenBalanceReceiverQuery = await new AccountBalanceQuery() + .setAccountId(receiverId) + .execute(env.client); + + const tokenBalanceFTReceiver = tokenBalanceReceiverQuery.tokens + .get(ftId) + .toInt(); + const tokenBalanceNFTReceiver = tokenBalanceReceiverQuery.tokens + .get(nftId) + .toInt(); + + expect(tokenBalanceFTReceiver).to.be.equal(0); + expect(tokenBalanceNFTReceiver).to.be.equal(0); + + // check token balance of treasury + const tokenBalanceTreasuryQuery = await new AccountBalanceQuery() + .setAccountId(env.operatorId) + .execute(env.client); + + const tokenBalanceTreasury = tokenBalanceTreasuryQuery.tokens + .get(ftId) + .toInt(); + const tokenBalance2Treasury = tokenBalanceTreasuryQuery.tokens + .get(nftId) + .toInt(); + + expect(tokenBalanceTreasury).to.be.equal(1000000); + expect(tokenBalance2Treasury).to.be.equal(1); + }); + + it("should throw if RejectToken transaction has empty token id list", async function () { + try { + await ( + await new TokenRejectTransaction().execute(env.client) + ).getReceipt(env.client); + } catch (err) { + expect(err.message).to.include("EMPTY_TOKEN_REFERENCE_LIST"); + } + }); + }); + + after(async function () { + await env.close(); + }); +}); diff --git a/test/unit/AccountInfoMocking.js b/test/unit/AccountInfoMocking.js index 6366938f3..10722ec55 100644 --- a/test/unit/AccountInfoMocking.js +++ b/test/unit/AccountInfoMocking.js @@ -399,7 +399,7 @@ describe("AccountInfoMocking", function () { } catch (error) { if ( error.message !== - "transaction 0.0.1854@1651168054.029348185 failed precheck with status TRANSACTION_EXPIRED" + "transaction 0.0.1854@1651168054.029348185 failed precheck with status TRANSACTION_EXPIRED against node account id 0.0.3" ) { throw error; } diff --git a/test/unit/TokenRejectFlow.js b/test/unit/TokenRejectFlow.js new file mode 100644 index 000000000..33c10ab4d --- /dev/null +++ b/test/unit/TokenRejectFlow.js @@ -0,0 +1,81 @@ +/* eslint-disable mocha/no-setup-in-describe */ + +import { + AccountId, + Client, + NftId, + TokenId, + TokenRejectFlow, +} from "../../src/index.js"; + +describe("TokenRejectFlow", function () { + let tokenIds = [ + TokenId.fromString("1.2.3"), + TokenId.fromString("1.2.4"), + TokenId.fromString("1.2.5"), + ]; + + let nftIds = [ + new NftId(tokenIds[0], 1), + new NftId(tokenIds[1], 2), + new NftId(tokenIds[2], 3), + ]; + + let tx; + + it("should set owner id", function () { + const owner = new AccountId(1); + tx = new TokenRejectFlow().setOwnerId(owner); + expect(tx.ownerId.toString()).to.equal(owner.toString()); + }); + + it("set owner id when frozen", async function () { + const client = Client.forLocalNode(); + tx = new TokenRejectFlow().addNftId(nftIds[0]).freezeWith(client); + + let err = false; + try { + tx.setOwnerId(new AccountId(2)); + } catch (error) { + err = true; + } + + expect(err).to.equal(true); + }); + + it("should set token ids", function () { + const tx = new TokenRejectFlow().setTokenIds(tokenIds); + expect(tx.tokenIds).to.deep.equal(tokenIds); + }); + + it("should not be able to set token ids frozen", function () { + const client = Client.forLocalNode(); + const tx = new TokenRejectFlow().setTokenIds().freezeWith(client); + let err = false; + try { + tx.setTokenIds(tokenIds); + } catch (error) { + err = true; + } + + expect(err).to.equal(true); + }); + + it("should be able to set token nft ids", function () { + const tx = new TokenRejectFlow().setNftIds(nftIds); + expect(tx.nftIds).to.deep.equal(nftIds); + }); + + it("should not be able to set nft ids frozen", function () { + const client = Client.forLocalNode(); + const tx = new TokenRejectFlow().setNftIds().freezeWith(client); + let err = false; + try { + tx.setNftIds(nftIds); + } catch (error) { + err = true; + } + + expect(err).to.equal(true); + }); +}); diff --git a/test/unit/TokenRejectTransaction.js b/test/unit/TokenRejectTransaction.js new file mode 100644 index 000000000..eb8b785bd --- /dev/null +++ b/test/unit/TokenRejectTransaction.js @@ -0,0 +1,112 @@ +/* eslint-disable mocha/no-setup-in-describe */ +import { + AccountId, + NftId, + Timestamp, + TokenId, + TokenRejectTransaction, + Transaction, + TransactionId, +} from "../../src/index.js"; + +describe("Transaction", function () { + const owner = new AccountId(1); + const tokenIds = [new TokenId(2)]; + const nftId = new NftId(tokenIds[0], 3); + it("encodes to correct protobuf", async function () { + const owner = new AccountId(1); + const tokenReject = new TokenRejectTransaction() + .setOwnerId(owner) + .setTokenIds(tokenIds) + .setNftIds([nftId]); + + const protobuf = await tokenReject._makeTransactionData(); + expect(protobuf).to.deep.include({ + owner: owner._toProtobuf(), + rejections: [ + { + fungibleToken: tokenIds[0]._toProtobuf(), + }, + { + nft: nftId._toProtobuf(), + }, + ], + }); + }); + + it("decodes from protobuf", async function () { + const tx = new TokenRejectTransaction() + .setOwnerId(owner) + .setTokenIds(tokenIds) + .setNftIds([nftId]); + + const decodedBackTx = Transaction.fromBytes(tx.toBytes()); + expect(tx.ownerId.toString()).to.equal( + decodedBackTx.ownerId.toString(), + ); + expect(tx.tokenIds.toString()).to.equal( + decodedBackTx.tokenIds.toString(), + ); + expect(tx.nftIds.toString()).to.equal(decodedBackTx.nftIds.toString()); + }); + + it("should set owner id", function () { + const owner = new AccountId(1); + const tx = new TokenRejectTransaction().setOwnerId(owner); + expect(tx.ownerId).to.equal(owner); + }); + + it("should revert when updating owner id while frozen", function () { + const owner = new AccountId(1); + const timestamp = new Timestamp(14, 15); + + const tx = new TokenRejectTransaction() + .setTransactionId(TransactionId.withValidStart(owner, timestamp)) + .setNodeAccountIds([new AccountId(10, 11, 12)]) + .freeze(); + + expect(() => tx.setOwnerId(new AccountId(2))).to.throw( + "transaction is immutable; it has at least one signature or has been explicitly frozen", + ); + }); + + it("should set token ids", function () { + const tokenIds = [new TokenId(1), new TokenId(2)]; + const tx = new TokenRejectTransaction().setTokenIds(tokenIds); + expect(tx.tokenIds).to.deep.equal(tokenIds); + }); + + it("should revert when updating token ids when frozen", function () { + const tokenIds = [new TokenId(1), new TokenId(2)]; + const owner = new AccountId(1); + const timestamp = new Timestamp(14, 15); + + const tx = new TokenRejectTransaction() + .setNodeAccountIds([new AccountId(10, 11, 12)]) + .setTransactionId(TransactionId.withValidStart(owner, timestamp)) + .freeze(); + expect(() => tx.setTokenIds(tokenIds)).to.throw( + "transaction is immutable; it has at least one signature or has been explicitly frozen", + ); + }); + + it("should set nft ids", function () { + const nftIds = [new NftId(1), new NftId(2)]; + const tx = new TokenRejectTransaction().setNftIds(nftIds); + expect(tx.nftIds).to.deep.equal(nftIds); + }); + + it("should revert when updating nft ids when frozen", function () { + const nftIds = [new NftId(1), new NftId(2)]; + const owner = new AccountId(1); + const timestamp = new Timestamp(14, 15); + + const tx = new TokenRejectTransaction() + .setNodeAccountIds([new AccountId(10, 11, 12)]) + .setTransactionId(TransactionId.withValidStart(owner, timestamp)) + .freeze(); + expect(() => tx.setNftIds(nftIds)).to.throw( + "transaction is immutable; it has at least one signature or has been explicitly frozen", + ); + }); +});