diff --git a/CHANGELOG.md b/CHANGELOG.md index a23e47901..8c266ccb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ 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). +## 2.37.0 + +### Changed +- updated `bouncycastle` dependency +- updated `protoc` dependency +- other various codebase chores + ## 2.36.0 ### Added diff --git a/docs/android-app/android-app-quickstart.md b/docs/android-app/android-app-quickstart.md index 128c785df..daf60d3fb 100644 --- a/docs/android-app/android-app-quickstart.md +++ b/docs/android-app/android-app-quickstart.md @@ -6,7 +6,7 @@ To get started with an Android project, you'll need to add the following **two** 1. **Hedera™ Java SDK:** ```groovy -implementation 'com.hedera.hashgraph:sdk:2.36.0' +implementation 'com.hedera.hashgraph:sdk:2.37.0' ``` 2. **gRPC implementation:** diff --git a/docs/java-app/java-app-quickstart.md b/docs/java-app/java-app-quickstart.md index f921d6d26..61f690ced 100644 --- a/docs/java-app/java-app-quickstart.md +++ b/docs/java-app/java-app-quickstart.md @@ -8,7 +8,7 @@ To get started with a Java project, you'll need to add the following **three** d _Gradle:_ ```groovy -implementation 'com.hedera.hashgraph:sdk:2.36.0' +implementation 'com.hedera.hashgraph:sdk:2.37.0' ``` _Maven:_ @@ -16,7 +16,7 @@ _Maven:_ com.hedera.hashgraph sdk - 2.36.0 + 2.37.0 ``` diff --git a/example-android/app/build.gradle.kts b/example-android/app/build.gradle.kts index 95cde5bae..afcc6cae5 100644 --- a/example-android/app/build.gradle.kts +++ b/example-android/app/build.gradle.kts @@ -68,7 +68,7 @@ dependencies { implementation(platform("com.hedera.hashgraph:sdk-dependency-versions")) // --------------------------------------------- - implementation("com.hedera.hashgraph:sdk:2.36.0") + implementation("com.hedera.hashgraph:sdk:2.37.0") implementation("com.google.android.material:material:1.11.0") diff --git a/examples/build.gradle.kts b/examples/build.gradle.kts index bd87bf382..cbb6f3242 100644 --- a/examples/build.gradle.kts +++ b/examples/build.gradle.kts @@ -28,6 +28,6 @@ mainModuleInfo { } dependencies.constraints { - implementation("com.hedera.hashgraph:sdk:2.36.0") - implementation("com.hedera.hashgraph:sdk-full:2.36.0") + implementation("com.hedera.hashgraph:sdk:2.37.0") + implementation("com.hedera.hashgraph:sdk-full:2.37.0") } diff --git a/sdk/src/main/java/com/hedera/hashgraph/sdk/RequestType.java b/sdk/src/main/java/com/hedera/hashgraph/sdk/RequestType.java index 658303705..dfcab59c6 100644 --- a/sdk/src/main/java/com/hedera/hashgraph/sdk/RequestType.java +++ b/sdk/src/main/java/com/hedera/hashgraph/sdk/RequestType.java @@ -417,7 +417,22 @@ public enum RequestType { /** * Transfer one or more token balances held by the requesting account to the treasury for each token type. */ - TOKEN_REJECT(HederaFunctionality.TokenReject); + TOKEN_REJECT(HederaFunctionality.TokenReject), + + /** + * Airdrop one or more tokens to one or more accounts. + */ + TOKEN_AIRDROP(HederaFunctionality.TokenAirdrop), + + /** + * Remove one or more pending airdrops from state on behalf of the sender(s) for each airdrop. + */ + TOKEN_CANCEL_AIRDROP(HederaFunctionality.TokenCancelAirdrop), + + /** + * Claim one or more pending airdrops + */ + TOKEN_CLAIM_AIRDROP(HederaFunctionality.TokenClaimAirdrop); final HederaFunctionality code; @@ -506,6 +521,9 @@ static RequestType valueOf(HederaFunctionality code) { case NodeUpdate -> NODE_UPDATE; case NodeDelete -> NODE_DELETE; case TokenReject -> TOKEN_REJECT; + case TokenAirdrop -> TOKEN_AIRDROP; + case TokenCancelAirdrop -> TOKEN_CANCEL_AIRDROP; + case TokenClaimAirdrop -> TOKEN_CLAIM_AIRDROP; default -> throw new IllegalStateException("(BUG) unhandled HederaFunctionality"); }; } @@ -592,6 +610,9 @@ public String toString() { case NODE_UPDATE -> "NODE_UPDATE"; case NODE_DELETE -> "NODE_DELETE"; case TOKEN_REJECT -> "TOKEN_REJECT"; + case TOKEN_AIRDROP -> "TOKEN_AIRDROP"; + case TOKEN_CANCEL_AIRDROP -> "TOKEN_CANCEL_AIRDROP"; + case TOKEN_CLAIM_AIRDROP -> "TOKEN_CLAIM_AIRDROP"; }; } } diff --git a/sdk/src/main/java/com/hedera/hashgraph/sdk/Status.java b/sdk/src/main/java/com/hedera/hashgraph/sdk/Status.java index 53f4bc375..e455cccc4 100644 --- a/sdk/src/main/java/com/hedera/hashgraph/sdk/Status.java +++ b/sdk/src/main/java/com/hedera/hashgraph/sdk/Status.java @@ -1685,7 +1685,40 @@ public enum Status { /** * The node account is not allowed to be updated */ - UPDATE_NODE_ACCOUNT_NOT_ALLOWED(ResponseCodeEnum.UPDATE_NODE_ACCOUNT_NOT_ALLOWED); + UPDATE_NODE_ACCOUNT_NOT_ALLOWED(ResponseCodeEnum.UPDATE_NODE_ACCOUNT_NOT_ALLOWED), + + /** + * The token has no metadata or supply key + */ + TOKEN_HAS_NO_METADATA_OR_SUPPLY_KEY(ResponseCodeEnum.TOKEN_HAS_NO_METADATA_OR_SUPPLY_KEY), + + /** + * The transaction attempted to the use an empty List of `PendingAirdropId`. + */ + EMPTY_PENDING_AIRDROP_ID_LIST(ResponseCodeEnum.EMPTY_PENDING_AIRDROP_ID_LIST), + + /** + * The transaction attempted to the same `PendingAirdropId` twice. + */ + PENDING_AIRDROP_ID_REPEATED(ResponseCodeEnum.PENDING_AIRDROP_ID_REPEATED), + + /** + * The transaction attempted to use more than the allowed number of `PendingAirdropId`. + */ + MAX_PENDING_AIRDROP_ID_EXCEEDED(ResponseCodeEnum.MAX_PENDING_AIRDROP_ID_EXCEEDED), + + /** + * A pending airdrop already exists for the specified NFT. + */ + PENDING_NFT_AIRDROP_ALREADY_EXISTS(ResponseCodeEnum.PENDING_NFT_AIRDROP_ALREADY_EXISTS), + + /** + * 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. + */ + ACCOUNT_HAS_PENDING_AIRDROPS(ResponseCodeEnum.ACCOUNT_HAS_PENDING_AIRDROPS); final ResponseCodeEnum code; @@ -2013,6 +2046,12 @@ static Status valueOf(ResponseCodeEnum code) { case INVALID_IPV4_ADDRESS -> INVALID_IPV4_ADDRESS; case EMPTY_TOKEN_REFERENCE_LIST -> EMPTY_TOKEN_REFERENCE_LIST; case UPDATE_NODE_ACCOUNT_NOT_ALLOWED -> UPDATE_NODE_ACCOUNT_NOT_ALLOWED; + case TOKEN_HAS_NO_METADATA_OR_SUPPLY_KEY -> TOKEN_HAS_NO_METADATA_OR_SUPPLY_KEY; + case EMPTY_PENDING_AIRDROP_ID_LIST -> EMPTY_PENDING_AIRDROP_ID_LIST; + case PENDING_AIRDROP_ID_REPEATED -> PENDING_AIRDROP_ID_REPEATED; + case MAX_PENDING_AIRDROP_ID_EXCEEDED -> MAX_PENDING_AIRDROP_ID_EXCEEDED; + case PENDING_NFT_AIRDROP_ALREADY_EXISTS -> PENDING_NFT_AIRDROP_ALREADY_EXISTS; + case ACCOUNT_HAS_PENDING_AIRDROPS -> ACCOUNT_HAS_PENDING_AIRDROPS; case UNRECOGNIZED -> // NOTE: Protobuf deserialization will not give us the code on the wire throw new IllegalArgumentException( diff --git a/sdk/src/main/proto/account.proto b/sdk/src/main/proto/account.proto index e418f7db4..0eda66289 100644 --- a/sdk/src/main/proto/account.proto +++ b/sdk/src/main/proto/account.proto @@ -203,6 +203,17 @@ message Account { * It will be null if if the account is not a contract or the contract has no storage mappings. */ bytes first_contract_storage_key = 33; + + /** + * A pending airdrop ID at the head of the linked list for this account + * from the account airdrops map.
+ * The account airdrops are connected by including the "next" and "previous" + * `PendingAirdropID` in each `AccountAirdrop` message. + *

+ * This value SHALL NOT be empty if this account is "sender" for any + * pending airdrop, and SHALL be empty otherwise. + */ + PendingAirdropId head_pending_airdrop_id = 34; } /** diff --git a/sdk/src/main/proto/account_pending_airdrop.proto b/sdk/src/main/proto/account_pending_airdrop.proto new file mode 100644 index 000000000..6b2c7b47b --- /dev/null +++ b/sdk/src/main/proto/account_pending_airdrop.proto @@ -0,0 +1,70 @@ +syntax = "proto3"; + +package proto; + +/* + * Copyright (C) 2024 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 "basic_types.proto"; + +option java_package = "com.hedera.hashgraph.sdk.proto"; +// <<>> This comment is special code for setting PBJ Compiler java package +option java_multiple_files = true; + + +/** + * A node within a doubly linked list of pending airdrop references.
+ * This internal state message forms the entries in a doubly-linked list + * of references to pending airdrop entries that are "owed" by a particular + * account as "sender". + * + * Each entry in this list MUST refer to an existing pending airdrop.
+ * The pending airdrop MUST NOT be claimed.
+ * The pending airdrop MUST NOT be canceled.
+ * The pending airdrop `sender` account's `head_pending_airdrop_id` field + * MUST match the `pending_airdrop_id` field in this message. + * + * ### Record Stream Effects + * This value is not currently published in the record stream. + */ +message AccountPendingAirdrop { + /** + * The value of the current airdrop id. SHALL NOT be set for non fungible tokens + */ + PendingAirdropValue pending_airdrop_value = 1; + + /** + * A pending airdrop identifier.
+ * This identifies the specific pending airdrop that precedes this position + * within the doubly linked list of pending airdrops "owed" by the sending + * account associated with this account airdrop "list". + *

+ * This SHALL match `pending_airdrop_id` if this is the only entry + * in the "list". + */ + PendingAirdropId previous_airdrop = 2; + + /** + * A pending airdrop identifier.
+ * This identifies the specific pending airdrop that follows this position + * within the doubly linked list of pending airdrops "owed" by the sending + * account associated with this account airdrop "list". + *

+ * This SHALL match `pending_airdrop_id` if this is the only entry + * in the "list". + */ + PendingAirdropId next_airdrop = 3; +} diff --git a/sdk/src/main/proto/basic_types.proto b/sdk/src/main/proto/basic_types.proto index 827123e35..c19afc6cf 100644 --- a/sdk/src/main/proto/basic_types.proto +++ b/sdk/src/main/proto/basic_types.proto @@ -1211,6 +1211,21 @@ enum HederaFunctionality { * Transfer one or more token balances held by the requesting account to the treasury for each token type. */ TokenReject = 92; + + /** + * Airdrop one or more tokens to one or more accounts. + */ + TokenAirdrop = 93; + + /** + * Remove one or more pending airdrops from state on behalf of the sender(s) for each airdrop. + */ + TokenCancelAirdrop = 94; + + /** + * Claim one or more pending airdrops + */ + TokenClaimAirdrop = 95; } /** @@ -1669,3 +1684,69 @@ message StakingInfo { int64 staked_node_id = 6; } } + +/** + * A unique, composite, identifier for a pending airdrop. + * + * Each pending airdrop SHALL be uniquely identified by a PendingAirdropId. + * A PendingAirdropId SHALL be recorded when created and MUST be provided in any transaction + * that would modify that pending airdrop (such as a `claimAirdrop` or `cancelAirdrop`). + */ +message PendingAirdropId { + /** + * A sending account.
+ * This is the account that initiated, and SHALL fund, this pending airdrop.
+ * This field is REQUIRED. + */ + AccountID sender_id = 1; + + /** + * A receiving account.
+ * This is the ID of the account that SHALL receive the airdrop.
+ * This field is REQUIRED. + */ + AccountID receiver_id = 2; + + oneof token_reference { + /** + * A token ID.
+ * This is the type of token for a fungible/common token airdrop.
+ * This field is REQUIRED for a fungible/common token and MUST NOT be used for a + * non-fungible/unique token. + */ + TokenID fungible_token_type = 3; + + /** + * The id of a single NFT, consisting of a Token ID and serial number.
+ * This is the type of token for a non-fungible/unique token airdrop.
+ * This field is REQUIRED for a non-fungible/unique token and MUST NOT be used for a + * fungible/common token. + */ + NftID non_fungible_token = 4; + } +} + +/** + * A single pending airdrop value. + * + * This message SHALL record the airdrop amount for a fungible/common token.
+ * This message SHOULD be null for a non-fungible/unique token.
+ * If a non-null `PendingAirdropValue` is set for a non-fungible/unique token, the amount + * field MUST be `0`. + * + * It is RECOMMENDED that implementations store pending airdrop information as a key-value map + * from `PendingAirdropId` to `PendingAirdropValue`, with a `null` value used for non-fungible + * pending airdrops. + */ +message PendingAirdropValue { + /** + * An amount to transfer for fungible/common tokens.
+ * This is expressed in the smallest available units for that token + * (i.e. 10-`decimals` whole tokens).
+ * This amount SHALL be transferred from the sender to the receiver, if claimed.
+ * If the token is a fungible/common token, this value MUST be strictly greater than `0`. + * If the token is a non-fungible/unique token, this message SHOULD NOT be set, and if + * set, this field MUST be `0`. + */ + uint64 amount = 1; +} diff --git a/sdk/src/main/proto/response_code.proto b/sdk/src/main/proto/response_code.proto index cd1aeb5e4..4d91c09c2 100644 --- a/sdk/src/main/proto/response_code.proto +++ b/sdk/src/main/proto/response_code.proto @@ -1529,4 +1529,37 @@ enum ResponseCodeEnum { * The node account is not allowed to be updated */ UPDATE_NODE_ACCOUNT_NOT_ALLOWED = 359; + + /* + * The token has no metadata or supply key + */ + TOKEN_HAS_NO_METADATA_OR_SUPPLY_KEY = 360; + + /** + * The transaction attempted to the use an empty List of `PendingAirdropId`. + */ + EMPTY_PENDING_AIRDROP_ID_LIST = 361; + + /** + * The transaction attempted to the same `PendingAirdropId` twice. + */ + PENDING_AIRDROP_ID_REPEATED = 362; + + /** + * The transaction attempted to use more than the allowed number of `PendingAirdropId`. + */ + MAX_PENDING_AIRDROP_ID_EXCEEDED = 363; + + /* + * A pending airdrop already exists for the specified NFT. + */ + PENDING_NFT_AIRDROP_ALREADY_EXISTS = 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. + */ + ACCOUNT_HAS_PENDING_AIRDROPS = 365; } diff --git a/sdk/src/main/proto/schedulable_transaction_body.proto b/sdk/src/main/proto/schedulable_transaction_body.proto index 99e5e09b4..1cfa1cd28 100644 --- a/sdk/src/main/proto/schedulable_transaction_body.proto +++ b/sdk/src/main/proto/schedulable_transaction_body.proto @@ -66,6 +66,9 @@ import "token_pause.proto"; import "token_unpause.proto"; import "token_update_nfts.proto"; import "token_reject.proto"; +import "token_cancel_airdrop.proto"; +import "token_claim_airdrop.proto"; +import "token_airdrop.proto"; import "schedule_delete.proto"; import "util_prng.proto"; @@ -324,5 +327,20 @@ message SchedulableTransactionBody { * SHALL NOT be charged for this transaction. */ TokenRejectTransactionBody tokenReject = 45; + + /** + * Transaction body for a scheduled transaction to cancel an airdrop. + */ + TokenCancelAirdropTransactionBody tokenCancelAirdrop = 46; + + /** + * Transaction body for a scheduled transaction to claim an airdrop. + */ + TokenClaimAirdropTransactionBody tokenClaimAirdrop = 47; + + /** + * Transaction body for a scheduled transaction to airdrop tokens. + */ + TokenAirdropTransactionBody tokenAirdrop = 48; } } diff --git a/sdk/src/main/proto/token_airdrop.proto b/sdk/src/main/proto/token_airdrop.proto new file mode 100644 index 000000000..fb7b06099 --- /dev/null +++ b/sdk/src/main/proto/token_airdrop.proto @@ -0,0 +1,104 @@ +/** + * # Token Airdrop + * Messages used to implement a transaction to "airdrop" tokens.
+ * An "airdrop" is a distribution of tokens from a funding account + * to one or more recipient accounts, ideally with no action required + * by the recipient account(s). + * + * ### Keywords + * The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + * "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + * document are to be interpreted as described in [RFC2119](https://www.ietf.org/rfc/rfc2119). + */ +syntax = "proto3"; + +package proto; + +/*- + * ‌ + * Hedera Network Services Protobuf + * ​ + * Copyright (C) 2024 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. + * ‍ + */ + +option java_package = "com.hedera.hashgraph.sdk.proto"; +// <<>> This comment is special code for setting PBJ Compiler java package +option java_multiple_files = true; + +import "basic_types.proto"; + +/** + * Airdrop one or more tokens to one or more accounts. + * + * ### Effects + * This distributes tokens from the balance of one or more sending account(s) to the balance + * of one or more recipient accounts. Accounts MAY receive the tokens in one of four ways. + * + * - An account already associated to the token to be distributed SHALL receive the + * airdropped tokens immediately to the recipient account balance.
+ * The fee for this transfer SHALL include the transfer, the airdrop fee, and any custom fees. + * - An account with available automatic association slots SHALL be automatically + * associated to the token, and SHALL immediately receive the airdropped tokens to the + * recipient account balance.
+ * The fee for this transfer SHALL include the transfer, the association, the cost to renew + * that association once, the airdrop fee, and any custom fees. + * - An account with "receiver signature required" set SHALL have a "Pending Airdrop" created + * and must claim that airdrop with a `claimAirdrop` transaction.
+ * The fee for this transfer SHALL include the transfer, the association, the cost to renew + * that association once, the airdrop fee, and any custom fees. If the pending airdrop is not + * claimed immediately, the `sender` SHALL pay the cost to renew the token association, and + * the cost to maintain the pending airdrop, until the pending airdrop is claimed or cancelled. + * - An account with no available automatic association slots SHALL have a "Pending Airdrop" + * created and must claim that airdrop with a `claimAirdrop` transaction.
+ * The fee for this transfer SHALL include the transfer, the association, the cost to renew + * that association once, the airdrop fee, and any custom fees. If the pending airdrop is not + * claimed immediately, the `sender` SHALL pay the cost to renew the token association, and + * the cost to maintain the pending airdrop, until the pending airdrop is claimed or cancelled. + * + * If an airdrop would create a pending airdrop for a fungible/common token, and a pending airdrop + * for the same sender, receiver, and token already exists, the existing pending airdrop + * SHALL be updated to add the new amount to the existing airdrop, rather than creating a new + * pending airdrop. + * + * Any airdrop that completes immediately SHALL be irreversible. Any airdrop that results in a + * "Pending Airdrop" MAY be canceled via a `cancelAirdrop` transaction. + * + * All transfer fees (including custom fees and royalties), as well as the rent cost for the + * first auto-renewal period for any automatic-association slot occupied by the airdropped + * tokens, SHALL be charged to the account paying for this transaction. + * + * ### Record Stream Effects + * - Each successful transfer SHALL be recorded in `token_transfer_list` for the transaction record. + * - Each successful transfer that consumes an automatic association slot SHALL populate the + * `automatic_association` field for the record. + * - Each pending transfer _created_ SHALL be added to the `pending_airdrops` field for the record. + * - Each pending transfer _updated_ SHALL be added to the `pending_airdrops` field for the record. + */ +message TokenAirdropTransactionBody { + /** + * A list of token transfers representing one or more airdrops. + * The sender for each transfer MUST have sufficient balance to complete the transfers. + * + * All token transfers MUST successfully transfer tokens or create a pending airdrop + * for this transaction to succeed. + * This list MUST contain between 1 and 10 transfers, inclusive. + * + * Note that each transfer of fungible/common tokens requires both a debit and + * a credit, so each _fungible_ token transfer MUST have _balanced_ entries in the + * TokenTransferList for that transfer. + */ + repeated TokenTransferList token_transfers = 1; +} diff --git a/sdk/src/main/proto/token_cancel_airdrop.proto b/sdk/src/main/proto/token_cancel_airdrop.proto new file mode 100644 index 000000000..074aee7ee --- /dev/null +++ b/sdk/src/main/proto/token_cancel_airdrop.proto @@ -0,0 +1,60 @@ +/** + * # Token Cancel Airdrop + * Messages used to implement a transaction to cancel a pending airdrop. + * + * ### Keywords + * The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + * "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + * document are to be interpreted as described in [RFC2119](https://www.ietf.org/rfc/rfc2119). + */ +syntax = "proto3"; + +package proto; + +/* + * Copyright (C) 2024 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. + * + */ + +option java_package = "com.hedera.hashgraph.sdk.proto"; +// <<>> This comment is special code for setting PBJ Compiler java package +option java_multiple_files = true; + +import "basic_types.proto"; + +/** + * Token cancel airdrop
+ * Remove one or more pending airdrops from state on behalf of the sender(s) + * for each airdrop. + * + * Each pending airdrop canceled SHALL be removed from state and SHALL NOT be available to claim.
+ * Each cancellation SHALL be represented in the transaction body and SHALL NOT be restated + * in the record file.
+ * All cancellations MUST succeed for this transaction to succeed. + */ +message TokenCancelAirdropTransactionBody { + /** + * A list of one or more pending airdrop identifiers.
+ * This list declares the set of pending airdrop entries that the client + * wishes to cancel; on success all listed pending airdrop entries + * will be removed. + *

+ * This transaction MUST be signed by the account referenced by a `sender_id` for + * each entry in this list.
+ * This list MUST NOT have any duplicate entries.
+ * This list MUST contain between 1 and 10 entries, inclusive. + */ + repeated PendingAirdropId pending_airdrops = 1; +} diff --git a/sdk/src/main/proto/token_claim_airdrop.proto b/sdk/src/main/proto/token_claim_airdrop.proto new file mode 100644 index 000000000..2d89789c4 --- /dev/null +++ b/sdk/src/main/proto/token_claim_airdrop.proto @@ -0,0 +1,64 @@ +/** + * # Token Claim Airdrop + * Messages used to implement a transaction to claim a pending airdrop. + * + * ### Keywords + * The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + * "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + * document are to be interpreted as described in [RFC2119](https://www.ietf.org/rfc/rfc2119). + */ +syntax = "proto3"; + +package proto; + +/* + * Copyright (C) 2024 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. + * + */ + +option java_package = "com.hedera.hashgraph.sdk.proto"; +// <<>> This comment is special code for setting PBJ Compiler java package +option java_multiple_files = true; + +import "basic_types.proto"; + +/** + * Token claim airdrop
+ * Complete one or more pending transfers on behalf of the + * recipient(s) for an airdrop. + * + * The sender MUST have sufficient balance to fulfill the airdrop at the + * time of claim. If the sender does not have sufficient balance, the + * claim SHALL fail.
+ * Each pending airdrop successfully claimed SHALL be removed from state and + * SHALL NOT be available to claim again.
+ * Each claim SHALL be represented in the transaction body and + * SHALL NOT be restated in the record file.
+ * All claims MUST succeed for this transaction to succeed. + * + * ### Record Stream Effects + * The completed transfers SHALL be present in the transfer list. + */ +message TokenClaimAirdropTransactionBody { + /** + * A list of one or more pending airdrop identifiers. + *

+ * This transaction MUST be signed by the account identified by + * the `receiver_id` for each entry in this list.
+ * This list MUST contain between 1 and 10 entries, inclusive.
+ * This list MUST NOT have any duplicate entries. + */ + repeated PendingAirdropId pending_airdrops = 1; +} diff --git a/sdk/src/main/proto/token_service.proto b/sdk/src/main/proto/token_service.proto index 266b52418..65e30c9ec 100644 --- a/sdk/src/main/proto/token_service.proto +++ b/sdk/src/main/proto/token_service.proto @@ -150,4 +150,46 @@ service TokenService { * */ rpc rejectToken (Transaction) returns (TransactionResponse); + + /** + * Airdrop one or more tokens to one or more accounts.
+ * This distributes tokens from the balance of one or more sending account(s) to the balance + * of one or more recipient accounts. Accounts will receive the tokens in one of four ways. + *

+ * Any airdrop that completes immediately SHALL be irreversible. Any airdrop that results in a + * "Pending Airdrop" MAY be canceled via a `cancelAirdrop` transaction.
+ * All transfer fees (including custom fees and royalties), as well as the rent cost for the + * first auto-renewal period for any automatic-association slot occupied by the airdropped + * tokens, SHALL be charged to the account submitting this transaction. + */ + rpc airdropTokens (Transaction) returns (TransactionResponse); + + /** + * Cancel one or more pending airdrops. + *

+ * This transaction MUST be signed by _each_ account *sending* an airdrop to be canceled. + */ + rpc cancelAirdrop (Transaction) returns (TransactionResponse); + + /** + * Claim one or more pending airdrops. + *

+ * This transaction MUST be signed by _each_ account **receiving** an + * airdrop to be claimed.
+ * If a "Sender" lacks sufficient balance to fulfill the airdrop at the + * time the claim is made, that claim SHALL fail. + */ + rpc claimAirdrop (Transaction) returns (TransactionResponse); + } diff --git a/sdk/src/main/proto/transaction_body.proto b/sdk/src/main/proto/transaction_body.proto index 674d17f03..fb74bc04f 100644 --- a/sdk/src/main/proto/transaction_body.proto +++ b/sdk/src/main/proto/transaction_body.proto @@ -74,6 +74,9 @@ import "token_pause.proto"; import "token_unpause.proto"; import "token_update_nfts.proto"; import "token_reject.proto"; +import "token_airdrop.proto"; +import "token_cancel_airdrop.proto"; +import "token_claim_airdrop.proto"; import "schedule_create.proto"; import "schedule_delete.proto"; @@ -400,5 +403,20 @@ message TransactionBody { * SHALL NOT be charged for this transaction. */ TokenRejectTransactionBody tokenReject = 57; + + /** + * A transaction body for a `tokenAirdrop` request. + */ + TokenAirdropTransactionBody tokenAirdrop = 58; + + /** + * A transaction body for a `cancelAirdrop` request. + */ + TokenCancelAirdropTransactionBody tokenCancelAirdrop = 59; + + /** + * A transaction body for a `claimAirdrop` request. + */ + TokenClaimAirdropTransactionBody tokenClaimAirdrop = 60; } } diff --git a/sdk/src/main/proto/transaction_record.proto b/sdk/src/main/proto/transaction_record.proto index df6f9cb4b..87b84c117 100644 --- a/sdk/src/main/proto/transaction_record.proto +++ b/sdk/src/main/proto/transaction_record.proto @@ -152,4 +152,37 @@ message TransactionRecord { * This field is populated only when the EVM address is not specified in the related transaction body. */ bytes evm_address = 21; + + /** + * A list of pending token airdrops. + * Each pending airdrop represents a single requested transfer from a + * sending account to a recipient account. These pending transfers are + * issued unilaterally by the sending account, and MUST be claimed by the + * recipient account before the transfer MAY complete. + * A sender MAY cancel a pending airdrop before it is claimed. + * An airdrop transaction SHALL emit a pending airdrop when the recipient has no + * available automatic association slots available or when the recipient + * has set `receiver_sig_required`. + */ + repeated PendingAirdropRecord new_pending_airdrops = 22; +} + +/** + * A record of a new pending airdrop. + */ +message PendingAirdropRecord { + /** + * A unique, composite, identifier for a pending airdrop. + * This field is REQUIRED. + */ + PendingAirdropId pending_airdrop_id = 1; + + /** + * A single pending airdrop amount. + * If the pending airdrop is for a fungible/common token this field is REQUIRED + * and SHALL be the current amount of tokens offered. + * If the pending airdrop is for a non-fungible/unique token, this field SHALL NOT + * be set. + */ + PendingAirdropValue pending_airdrop_value = 2; } diff --git a/sdk/src/main/resources/addressbook/previewnet.pb b/sdk/src/main/resources/addressbook/previewnet.pb index e2a46a2d7..3b5388c0d 100644 --- a/sdk/src/main/resources/addressbook/previewnet.pb +++ b/sdk/src/main/resources/addressbook/previewnet.pb @@ -1,22 +1,22 @@ "308201a2300d06092a864886f70d01010105000382018f003082018a02820181009f1f8a121c2fd6c76fd508d3e429f0c64bcb44c82a70573552aadcad071569e721958f5a5d09f9587ffafcfbe5341a2f0114acae346ef3c90213d3436ebb27f4350c990c5c8c3f8e1e36707bc08d42560823e3f24e09a03ad0955a5098019629dd04b27b251dce055f3ddcb0a41d66f0941b0b87cdfe3498d46038ab5df06f62a5ade08598573a88c8f5860dc1492a6e186485a9b13250e6d17b80cd39c5c819109e73ca732db23ef8baa776ec85ce0091becb2edefbaa5ed3e5dbfbd1f885a4fa881af3f144a8a565853533d89393592086b2d1d362e45bfe1fb45683aba6c640979ad6b46877184726c6ebd58b2eae85c7cfe3fbabef5f6cced850034b3847206c2d678c361876026b8d351e002af5e0ffe6f5b1f295fdc2f469caa2d2381ea0b48ca987cc2c8e635e8b19ce5e172a93761a8d490a9a4518d7255880a14d77b7ba774892b92a40bb81362e34fc6d5178d9b30112934205cb77fb9a282427394564a8554ea47286a47f86239e75c94789ce98c99844782462944f613167d7b502030100012:`ffd6ada74a3a34a904bea47603086f8bef3b6be18abed44c4d40e12fb130b97bd6b855aec5d0b90b0b8c7354d5f3b0e4B -B +#ДB B #ДB -#ДJ"Hosted by Hedera | East Coast, USA +J"Hosted by Hedera | East Coast, USA "308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c557af579fa83501be899b28907765bfdfcd52ab432b0195a1f1ecd86fc00ab6c5509b0fdd97edd3cb5cea56a295f312abb550831dbf963f450118b4fcc6e22cf4676200ce9cc8edfbbf558dc69f024264ad7d3dab23bed2133c274e6934489155db1087f90370905c64185a6211dc742fb9a6909d82186947b277463dfb3ff0acd47eff12ead1f6972ef2c1203793c45e77575be4fa110c7e40fa8db9c6187d113f4704014179071abf59be7d2b0de82de4215dc25506b1c9c26e4917401c997506e377e6bf03b688727e7940fad69c5e0da3cd5cbd2be777350aea2d0d47e97a448c84be6ce134d64bee0985c29162f4c1e567cca93d06a3c1be8abce35b557fb77f4fe671a66dec790756d0e8818165f2bacaa891aae7ac7437fc7175b6eb6deb7472378751bb6bf9b0e1483f9668e9fdbd5604c39b14d9e2bedeec846a980d704d171e7ba4b7fcd1a30d945ca12f47a325d9398aa18f97066054d4d15fc8994e2debe73e9271d548683f61ea44fb25071e3518a78ed3eb37e71a0691f2670203010001(2:`f0d94accf6dff372874c9dbd8d7992eb317af5001ca4196aba265809cb3d200ba961a5438c3a5ed05c83bdf9cd115d22B +#B + ՒB #B -ՒB - -#J"Hosted by Hedera | East Coast, USA +ՒJ"Hosted by Hedera | East Coast, USA "308201a2300d06092a864886f70d01010105000382018f003082018a02820181009ba457b73305f04a91cc46b1b965c4e841751abc8b1415a0badfd1f32c2482386a22725eb7ec74dea21e50617d648ea5ac393741ab01b8efb321239b8d4fdb1dfbeb9e3f39aa46580dd045d18ca44d002c37ddb527cce4ddc32bfc73419671f4ca4464a3f2a84fc85c71acf0e5a89626df69a81474ed16529f801a8afa97e435c4e04a964a357527288843e58f0a05cf5153ee4507b2c68b3d7fb54ae6a95a959c87a12f630e95c7b1b3c3695e858662417926d76c16983faf61225038745907e9cf13d67c2acd503ca451c85933ac4118acc279801cb968349903145ced27629dd08916317093587a77c2205cfa52543b53c3b6ea15b84e3d2c30c1ed752a4633c36b25b9893ea02ad562eb9b7868b3b4f47f4a25e356064962ac7b25e582944f00d30798a262f9214d8c5e74d0a8376cc2d6ba64e18f5e4a40afac625062d2ca23cd2800708321d3834314f0e5844859232673a32e70ae0d711e310581bcdb14e87134694c6e0930f46b37b96d49a64573947331e7e507d9e56de5e6146f2f0203010001(2:`ca678ebcbd3dc8648f7ed03fb59f0e21af67513eaee51318e6b549be5ace906edc1ffa26d93a57acec9be77f40eaeed7B #B @@ -28,37 +28,37 @@ #JHosted by Hedera | Central, USA "308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c42ccac5fbc691fbbebda87ffd1e75bdcd8922494cf44fdbccee49788521c378bf77db0934ec0d2183d7c51db66f864c11ab7de1ac3c4cfdc1f093a2d6f37e2b34cbe4c8131f9683ad42878c83d3554c645aa167bcfb064a83dc45c5b1158499f9d92587fff7abcd5f221cd8150548413000fa6e5659089b1dfd65766ea78eaedfca6b45455fd8ab5984dbe35e5795d2c635ea7974d43e8eae4febffe492e707b48b1b0fc6481ae9e09d39133009b7d26402e6e52e5e91b2b380d88f0be7fb4b303e70219785057aa94ce924c4926e916569286e86b3ba651ca2a0a63df4f6907fefe3483d93b4ce1d4d03c7142111375b2c2c51d4eb839e37af530b2cbd6f50d4cb36e27937170d9cddac0ace2cc24b804b0a27351cf830b76525e26dfb9dbf49a056624a76862494e7263d0d70cebae952943e55842f5cad13fcf60a2e6dcf7a1d533f3a5bb54ec21918c76e525ba29146675831e17e36c61fe85498828d09b762015412b2e527849baec1cffc77de4c294c550811e598ff24da15a34569dd0203010001(2:`2471f3fe8140681fe91913d2cc063f065e4490ae62ff5d548a5abe131d2af96cbe3ac25bbe24366ca4f8f0e76cf945f3B -6&B +#mB -6&B +6&B #mB -#mJ"Hosted by Hedera | West Coast, USA +6&J"Hosted by Hedera | West Coast, USA "308201a2300d06092a864886f70d01010105000382018f003082018a0282018100902f0490a9b7f5d2cd1c0d96c6a6990f573b5f0eb5bdbba39661ef023092419344669969a68a4c7071d329990fb1792e9001cb5598ea71c2d6676824320ee4cabf1dd357ae7f2adbedc1b1b0a9d95623779b4c4c7b47c4787a16ee7188c7217177624a9264ab39c41f7ff0b45a89bda40c4ad07c4d596d5f09d7056bcb5a35f44f95a59c266e09892dcbe46ad51f2d2b3e991a8f6658e1f2cb94c773eb44c44e892d1e55c1076f1608319ee657e40f192967543ab42ab222386d17586e253748dabd025e50b50ae6050720e239d64ee6fb4507c0614dd4be7afdb1330890ff3a6e176527c3116af129a9ac5e336d9f601e7127a6d7d820ad2f902dac9b248668a1bab08d10342ea69a7097132ff7120cc64fcde7840c656ba1732ba95e9c36751175e4ec3d84a7e0d28842b41bbbbd6f28e46c3a6633e1827965c55820d50dae2b0465cc0d42e195b9d1532e6225eb998d6a49079a8a1cd4d0175de3c87f97614847b3cbb17aa34be820b7b3ad98ac3faef993a6778974782c0c4ae3fabbcc430203010001(2:`f357873d4114a1aef03adc6ba69efaf2690e227abc16a6fc6e5049a63fbd9688004b14e463c20e38436a3a24d3182dd8B +63B + #A3B 63B -#A3B - -63J"Hosted by Hedera | West Coast, USA +#A3J"Hosted by Hedera | West Coast, USA "308201a2300d06092a864886f70d01010105000382018f003082018a028201810091d7dfff78f4efbe5890450c5bc9e3534bffadad93fb7afb15bc7bcf67d3d3b413bd99940dd82564ada04ab2e4edf0a1c0b8fb7e1a8092e9138e960be2cc68b5b97f57d281c5872e97a479fc848363160e3863b57b33e4869b185ace5e36bd43ae5fa678c9eb66f1f4014786826b2f8fa7e0060f4405c0a8f9da7205ff4683a243fa0f315f1afbb4a4d140d02234e4473fb92fcb38f3eb28c60cf7cbfb64e069c18086e4dd61938920ae0fd7c193e6e104e65b817ed9398e232237fdf08322c9cec09d4099272a7c015d22b4dcc969f6ea1f518902105df60092b55a41b4f32b957b57d84e5b223905e8698951733ea9f2e2461ec0d6522ee816d5850facfeb412cff9b99943a87dc0d046447ce93b97e16d73b96b4263962f81fcf9458e57577c780a6f1615aa7a12326738e269bb731f89e891622e577ea54420bf0ca46be6fc4f71cf2681ac0252aa885e13be672cd284590427dcd137cf311625e8bee3b08fdcaaf465b387ce7cb33816f2c14a6b99ac7d734318cfc59b7ed939bafef8790203010001(2:`4931a78202d55f10b31575785c3f439db6819bd11003df7bc2ce92e29a517b7c21880deb4c01795744b576cd43b8498dB -"jAB +#SYB -#SYB +"jAB "jAB -#SYJ"Hosted by Hedera | West Coast, USA +#SYJ"Hosted by Hedera | West Coast, USA "308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c6e18c8fbf4cd4eb104542cb20aaaa252d95f052f1086d581c44ad737bf6676c0c3f789af5265b8afb79b50912da84e0afcf7547cb1fff08d0527017eb6dc5cdf83b51969d44336a6387cd70b94bf4c9baf2029840e5f4f863d7081f0fa81e0863adedb8b89a5dac2bb552d6e7b9fba222ac28c57075538fc957992942d341fa2876e6b507e9ce7ed572e8cfda5defa364fdf8d8e23829a4ccbb478f11eee3b32ab85e072951c5d9420115fba327073494f43b5f6bebf84152e356e7b16ba764b7a3b52cb2734640163be1465e6d1fa4c6e6f66684a635c9a556aa7100dbe645df8f4c423ae45a08cb35b4bc187886e2299b5c0210a5fba3b9449f483ef94ed922e1e98c113be166b89c73582243135d442306abe5a71b77018ff335d6dd79542697b168238b96727fd1339b5f82a3b6a597d976037ae2506456c8b34e9fbf3bc32410441c4bfc8eba58597254efebfaa78809a5c8854729a5ba78ece19fc8407dd8894a6bc7844037d878cace6c152c2e89e8a64b068a6c237e09993be806890203010001(2 :`64e098615bf405f7ed5a4013446b89c488cfcd6bb25a4a676dc77eea11d33d702682f0a69a8030e8c5777d0e42203799B "}1B -2]B +2]B -"}1B +2]B -2]J"Hosted by Hedera | West Coast, USA \ No newline at end of file +"}1J"Hosted by Hedera | West Coast, USA \ No newline at end of file diff --git a/sdk/src/main/resources/addressbook/testnet.pb b/sdk/src/main/resources/addressbook/testnet.pb index 138b3e527..bddabc0e4 100644 --- a/sdk/src/main/resources/addressbook/testnet.pb +++ b/sdk/src/main/resources/addressbook/testnet.pb @@ -1,64 +1,64 @@ "308201a2300d06092a864886f70d01010105000382018f003082018a02820181009f1f8a121c2fd6c76fd508d3e429f0c64bcb44c82a70573552aadcad071569e721958f5a5d09f9587ffafcfbe5341a2f0114acae346ef3c90213d3436ebb27f4350c990c5c8c3f8e1e36707bc08d42560823e3f24e09a03ad0955a5098019629dd04b27b251dce055f3ddcb0a41d66f0941b0b87cdfe3498d46038ab5df06f62a5ade08598573a88c8f5860dc1492a6e186485a9b13250e6d17b80cd39c5c819109e73ca732db23ef8baa776ec85ce0091becb2edefbaa5ed3e5dbfbd1f885a4fa881af3f144a8a565853533d89393592086b2d1d362e45bfe1fb45683aba6c640979ad6b46877184726c6ebd58b2eae85c7cfe3fbabef5f6cced850034b3847206c2d678c361876026b8d351e002af5e0ffe6f5b1f295fdc2f469caa2d2381ea0b48ca987cc2c8e635e8b19ce5e172a93761a8d490a9a4518d7255880a14d77b7ba774892b92a40bb81362e34fc6d5178d9b30112934205cb77fb9a282427394564a8554ea47286a47f86239e75c94789ce98c99844782462944f613167d7b502030100012:`a171e3ba83476747aeb2e2ac4d0e115caaab918203b0dfe1cdeab443438fc289abc8ba8a6aff83db5f1b334046da88c8B -2B +2B "^j=B -"^j=B +2B -2J"Hosted by Hedera | West Coast, USA +"^j=J"Hosted by Hedera | West Coast, USA "308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c557af579fa83501be899b28907765bfdfcd52ab432b0195a1f1ecd86fc00ab6c5509b0fdd97edd3cb5cea56a295f312abb550831dbf963f450118b4fcc6e22cf4676200ce9cc8edfbbf558dc69f024264ad7d3dab23bed2133c274e6934489155db1087f90370905c64185a6211dc742fb9a6909d82186947b277463dfb3ff0acd47eff12ead1f6972ef2c1203793c45e77575be4fa110c7e40fa8db9c6187d113f4704014179071abf59be7d2b0de82de4215dc25506b1c9c26e4917401c997506e377e6bf03b688727e7940fad69c5e0da3cd5cbd2be777350aea2d0d47e97a448c84be6ce134d64bee0985c29162f4c1e567cca93d06a3c1be8abce35b557fb77f4fe671a66dec790756d0e8818165f2bacaa891aae7ac7437fc7175b6eb6deb7472378751bb6bf9b0e1483f9668e9fdbd5604c39b14d9e2bedeec846a980d704d171e7ba4b7fcd1a30d945ca12f47a325d9398aa18f97066054d4d15fc8994e2debe73e9271d548683f61ea44fb25071e3518a78ed3eb37e71a0691f2670203010001(2:`7409dec2e494b627ee49c69b294be1ceaebca3fdcaf36789e88fc7d5b0eef5561f52b82d35191a39c2fbed6027267166B - B +#w7B - B + B -#w7B +#w7B -#w7J"Hosted by Hedera | East Coast, USA + J"Hosted by Hedera | East Coast, USA "308201a2300d06092a864886f70d01010105000382018f003082018a02820181009ba457b73305f04a91cc46b1b965c4e841751abc8b1415a0badfd1f32c2482386a22725eb7ec74dea21e50617d648ea5ac393741ab01b8efb321239b8d4fdb1dfbeb9e3f39aa46580dd045d18ca44d002c37ddb527cce4ddc32bfc73419671f4ca4464a3f2a84fc85c71acf0e5a89626df69a81474ed16529f801a8afa97e435c4e04a964a357527288843e58f0a05cf5153ee4507b2c68b3d7fb54ae6a95a959c87a12f630e95c7b1b3c3695e858662417926d76c16983faf61225038745907e9cf13d67c2acd503ca451c85933ac4118acc279801cb968349903145ced27629dd08916317093587a77c2205cfa52543b53c3b6ea15b84e3d2c30c1ed752a4633c36b25b9893ea02ad562eb9b7868b3b4f47f4a25e356064962ac7b25e582944f00d30798a262f9214d8c5e74d0a8376cc2d6ba64e18f5e4a40afac625062d2ca23cd2800708321d3834314f0e5844859232673a32e70ae0d711e310581bcdb14e87134694c6e0930f46b37b96d49a64573947331e7e507d9e56de5e6146f2f0203010001(2:`9b1416584a4a380bb86a6c7d7207d8aeddbc3b63ea305998255bce8351ba4b5dca52c9282a54a6bed60de63ce03aaa24B -4VB +#B 4VB -#B +#B -#J"Hosted by Hedera | East Coast, USA +4VJ"Hosted by Hedera | East Coast, USA "308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c42ccac5fbc691fbbebda87ffd1e75bdcd8922494cf44fdbccee49788521c378bf77db0934ec0d2183d7c51db66f864c11ab7de1ac3c4cfdc1f093a2d6f37e2b34cbe4c8131f9683ad42878c83d3554c645aa167bcfb064a83dc45c5b1158499f9d92587fff7abcd5f221cd8150548413000fa6e5659089b1dfd65766ea78eaedfca6b45455fd8ab5984dbe35e5795d2c635ea7974d43e8eae4febffe492e707b48b1b0fc6481ae9e09d39133009b7d26402e6e52e5e91b2b380d88f0be7fb4b303e70219785057aa94ce924c4926e916569286e86b3ba651ca2a0a63df4f6907fefe3483d93b4ce1d4d03c7142111375b2c2c51d4eb839e37af530b2cbd6f50d4cb36e27937170d9cddac0ace2cc24b804b0a27351cf830b76525e26dfb9dbf49a056624a76862494e7263d0d70cebae952943e55842f5cad13fcf60a2e6dcf7a1d533f3a5bb54ec21918c76e525ba29146675831e17e36c61fe85498828d09b762015412b2e527849baec1cffc77de4c294c550811e598ff24da15a34569dd0203010001(2:`6486685b4e6e0cb963472c01fe99931fd9e4c44887ba83423ae7feed22d648484cf8a3bc5ccca6a37387bf96d3867280B -6F!B +6F!B "SptB -6F!B +6F!B "SptJ"Hosted by Hedera | West Coast, USA "308201a2300d06092a864886f70d01010105000382018f003082018a0282018100902f0490a9b7f5d2cd1c0d96c6a6990f573b5f0eb5bdbba39661ef023092419344669969a68a4c7071d329990fb1792e9001cb5598ea71c2d6676824320ee4cabf1dd357ae7f2adbedc1b1b0a9d95623779b4c4c7b47c4787a16ee7188c7217177624a9264ab39c41f7ff0b45a89bda40c4ad07c4d596d5f09d7056bcb5a35f44f95a59c266e09892dcbe46ad51f2d2b3e991a8f6658e1f2cb94c773eb44c44e892d1e55c1076f1608319ee657e40f192967543ab42ab222386d17586e253748dabd025e50b50ae6050720e239d64ee6fb4507c0614dd4be7afdb1330890ff3a6e176527c3116af129a9ac5e336d9f601e7127a6d7d820ad2f902dac9b248668a1bab08d10342ea69a7097132ff7120cc64fcde7840c656ba1732ba95e9c36751175e4ec3d84a7e0d28842b41bbbbd6f28e46c3a6633e1827965c55820d50dae2b0465cc0d42e195b9d1532e6225eb998d6a49079a8a1cd4d0175de3c87f97614847b3cbb17aa34be820b7b3ad98ac3faef993a6778974782c0c4ae3fabbcc430203010001(2:`39e909915a8528030154a6c770950c7b4777ba401357c0e6187654215cc20aaccdd8e5ff29e9c4d95cf4101fa68be45cB -6mB - "^B -6mB +6mB + +"^B -"^J"Hosted by Hedera | West Coast, USA +6mJ"Hosted by Hedera | West Coast, USA "308201a2300d06092a864886f70d01010105000382018f003082018a028201810091d7dfff78f4efbe5890450c5bc9e3534bffadad93fb7afb15bc7bcf67d3d3b413bd99940dd82564ada04ab2e4edf0a1c0b8fb7e1a8092e9138e960be2cc68b5b97f57d281c5872e97a479fc848363160e3863b57b33e4869b185ace5e36bd43ae5fa678c9eb66f1f4014786826b2f8fa7e0060f4405c0a8f9da7205ff4683a243fa0f315f1afbb4a4d140d02234e4473fb92fcb38f3eb28c60cf7cbfb64e069c18086e4dd61938920ae0fd7c193e6e104e65b817ed9398e232237fdf08322c9cec09d4099272a7c015d22b4dcc969f6ea1f518902105df60092b55a41b4f32b957b57d84e5b223905e8698951733ea9f2e2461ec0d6522ee816d5850facfeb412cff9b99943a87dc0d046447ce93b97e16d73b96b4263962f81fcf9458e57577c780a6f1615aa7a12326738e269bb731f89e891622e577ea54420bf0ca46be6fc4f71cf2681ac0252aa885e13be672cd284590427dcd137cf311625e8bee3b08fdcaaf465b387ce7cb33816f2c14a6b99ac7d734318cfc59b7ed939bafef8790203010001(2:`a44874a7aa1b37741a071adaae78fb152b696d1c58d8defbe1d82304532a0c019ee96cc19d75686578d39a1e6c31a1eeB "jfB -#1B - #1B -"jfJ"Hosted by Hedera | West Coast, USA -"308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c6e18c8fbf4cd4eb104542cb20aaaa252d95f052f1086d581c44ad737bf6676c0c3f789af5265b8afb79b50912da84e0afcf7547cb1fff08d0527017eb6dc5cdf83b51969d44336a6387cd70b94bf4c9baf2029840e5f4f863d7081f0fa81e0863adedb8b89a5dac2bb552d6e7b9fba222ac28c57075538fc957992942d341fa2876e6b507e9ce7ed572e8cfda5defa364fdf8d8e23829a4ccbb478f11eee3b32ab85e072951c5d9420115fba327073494f43b5f6bebf84152e356e7b16ba764b7a3b52cb2734640163be1465e6d1fa4c6e6f66684a635c9a556aa7100dbe645df8f4c423ae45a08cb35b4bc187886e2299b5c0210a5fba3b9449f483ef94ed922e1e98c113be166b89c73582243135d442306abe5a71b77018ff335d6dd79542697b168238b96727fd1339b5f82a3b6a597d976037ae2506456c8b34e9fbf3bc32410441c4bfc8eba58597254efebfaa78809a5c8854729a5ba78ece19fc8407dd8894a6bc7844037d878cace6c152c2e89e8a64b068a6c237e09993be806890203010001(2 :`69832a73a3602e8d1fbe5ad58d1c2637a1b672d71ee87af10db648eb91afb228253b1f47e57d3d4a44ff547b3394aa22B +"jfB -"B +#1J"Hosted by Hedera | West Coast, USA +"308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c6e18c8fbf4cd4eb104542cb20aaaa252d95f052f1086d581c44ad737bf6676c0c3f789af5265b8afb79b50912da84e0afcf7547cb1fff08d0527017eb6dc5cdf83b51969d44336a6387cd70b94bf4c9baf2029840e5f4f863d7081f0fa81e0863adedb8b89a5dac2bb552d6e7b9fba222ac28c57075538fc957992942d341fa2876e6b507e9ce7ed572e8cfda5defa364fdf8d8e23829a4ccbb478f11eee3b32ab85e072951c5d9420115fba327073494f43b5f6bebf84152e356e7b16ba764b7a3b52cb2734640163be1465e6d1fa4c6e6f66684a635c9a556aa7100dbe645df8f4c423ae45a08cb35b4bc187886e2299b5c0210a5fba3b9449f483ef94ed922e1e98c113be166b89c73582243135d442306abe5a71b77018ff335d6dd79542697b168238b96727fd1339b5f82a3b6a597d976037ae2506456c8b34e9fbf3bc32410441c4bfc8eba58597254efebfaa78809a5c8854729a5ba78ece19fc8407dd8894a6bc7844037d878cace6c152c2e89e8a64b068a6c237e09993be806890203010001(2 :`69832a73a3602e8d1fbe5ad58d1c2637a1b672d71ee87af10db648eb91afb228253b1f47e57d3d4a44ff547b3394aa22B -4B +4B "B -4JHosted by Hedera | Central, USA \ No newline at end of file +"B + +4JHosted by Hedera | Central, USA \ No newline at end of file diff --git a/version.txt b/version.txt index 3a05135cd..c94fd315f 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.36.0 +2.37.0