diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/airdrops/AirdropFromContractTest.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/airdrops/AirdropFromContractTest.java index 6dae928e2a2f..0378fba0b7ee 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/airdrops/AirdropFromContractTest.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/airdrops/AirdropFromContractTest.java @@ -18,20 +18,35 @@ import static com.hedera.services.bdd.junit.TestTags.SMART_CONTRACT; import static com.hedera.services.bdd.spec.HapiSpec.hapiTest; +import static com.hedera.services.bdd.spec.assertions.TransactionRecordAsserts.includingFungiblePendingAirdrop; +import static com.hedera.services.bdd.spec.assertions.TransactionRecordAsserts.includingNftPendingAirdrop; import static com.hedera.services.bdd.spec.assertions.TransactionRecordAsserts.recordWith; +import static com.hedera.services.bdd.spec.dsl.entities.SpecTokenKey.ADMIN_KEY; import static com.hedera.services.bdd.spec.dsl.entities.SpecTokenKey.FEE_SCHEDULE_KEY; import static com.hedera.services.bdd.spec.queries.QueryVerbs.getTxnRecord; +import static com.hedera.services.bdd.spec.transactions.TxnVerbs.contractDelete; import static com.hedera.services.bdd.spec.transactions.TxnVerbs.cryptoUpdate; +import static com.hedera.services.bdd.spec.transactions.TxnVerbs.tokenAssociate; import static com.hedera.services.bdd.spec.transactions.TxnVerbs.tokenFeeScheduleUpdate; +import static com.hedera.services.bdd.spec.transactions.token.CustomFeeSpecs.fixedHtsFee; import static com.hedera.services.bdd.spec.transactions.token.CustomFeeSpecs.fractionalFeeNetOfTransfers; +import static com.hedera.services.bdd.spec.transactions.token.TokenMovement.movingUnique; import static com.hedera.services.bdd.spec.utilops.CustomSpecAssert.allRunFor; import static com.hedera.services.bdd.spec.utilops.UtilVerbs.newKeyNamed; import static com.hedera.services.bdd.spec.utilops.UtilVerbs.withOpContext; +import static com.hedera.services.bdd.suites.HapiSuite.GENESIS; import static com.hedera.services.bdd.suites.contract.precompile.airdrops.SystemContractAirdropHelper.checkForBalances; import static com.hedera.services.bdd.suites.contract.precompile.airdrops.SystemContractAirdropHelper.checkForEmptyBalance; import static com.hedera.services.bdd.suites.contract.precompile.airdrops.SystemContractAirdropHelper.prepareAccountAddresses; import static com.hedera.services.bdd.suites.contract.precompile.airdrops.SystemContractAirdropHelper.prepareContractAddresses; import static com.hedera.services.bdd.suites.contract.precompile.airdrops.SystemContractAirdropHelper.prepareTokenAddresses; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.ACCOUNT_HAS_PENDING_AIRDROPS; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.ACCOUNT_REPEATED_IN_ACCOUNT_AMOUNTS; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.CONTRACT_REVERT_EXECUTED; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INSUFFICIENT_SENDER_ACCOUNT_BALANCE_FOR_CUSTOM_FEE; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INSUFFICIENT_TOKEN_BALANCE; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.PENDING_NFT_AIRDROP_ALREADY_EXISTS; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.TOKEN_ID_REPEATED_IN_TOKEN_LIST; import com.hedera.services.bdd.junit.HapiTest; import com.hedera.services.bdd.junit.HapiTestLifecycle; @@ -45,12 +60,14 @@ import com.hedera.services.bdd.spec.dsl.entities.SpecFungibleToken; import com.hedera.services.bdd.spec.dsl.entities.SpecNonFungibleToken; import com.hedera.services.bdd.spec.keys.KeyShape; +import com.hedera.services.bdd.spec.transactions.token.TokenMovement; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.List; import java.util.OptionalLong; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; @@ -292,4 +309,207 @@ public Stream airdropToAccountWithFreeAutoAssocSlots( receiver.getBalance().andAssert(balance -> balance.hasTokenBalance(nft.name(), 1L))); })); } + + @Nested + class AirdropFromContractNegativeCases { + + @HapiTest + @DisplayName("Airdrop token with custom fees while the sender cannot pay the fees") + public Stream airdropFromContractWhileTheSenderCannotPayTheCustomFees( + @NonNull @Account(maxAutoAssociations = 10, tinybarBalance = 100L) final SpecAccount receiver, + @Contract(contract = "EmptyOne", creationGas = 10_000_000L) final SpecContract sender, + @NonNull + @FungibleToken( + initialSupply = 1_000_000L, + name = "airdropToken", + keys = {ADMIN_KEY, FEE_SCHEDULE_KEY}) + final SpecFungibleToken token, + @NonNull @FungibleToken(initialSupply = 1_000_000L) final SpecFungibleToken tokenForFee) { + return hapiTest(withOpContext((spec, opLog) -> { + allRunFor( + spec, + sender.associateTokens(token, tokenForFee), + tokenAssociate(GENESIS, tokenForFee.name()), + sender.authorizeContract(airdropContract), + token.treasury().transferUnitsTo(sender, 500_000L, token), + tokenFeeScheduleUpdate(token.name()).withCustom(fixedHtsFee(5L, tokenForFee.name(), GENESIS))); + allRunFor( + spec, + airdropContract + .call("tokenAirdrop", token, sender, receiver, 10L) + .sending(85_000_000L) + .gas(1_500_000L) + .via("AirdropTxn") + .andAssert(txn -> txn.hasKnownStatuses( + CONTRACT_REVERT_EXECUTED, INSUFFICIENT_SENDER_ACCOUNT_BALANCE_FOR_CUSTOM_FEE))); + })); + } + + @HapiTest + @DisplayName( + "Airdrop nft to the same account twice should fail with TOKEN_ID_REPEATED_IN_TOKEN_LIST for single airdrop or PENDING_NFT_AIRDROP_ALREADY_EXISTS for multiple airdrops") + public Stream airdropNftToTheSameAccountTwice( + @NonNull @Account(maxAutoAssociations = 10, tinybarBalance = 100L) final SpecAccount associatedReceiver, + @NonNull @Account(maxAutoAssociations = 0, tinybarBalance = 100L) + final SpecAccount notAssociatedReceiver, + @Contract(contract = "EmptyOne", creationGas = 10_000_000L) final SpecContract sender, + @NonNull @NonFungibleToken(numPreMints = 1) final SpecNonFungibleToken nft) { + return hapiTest(withOpContext((spec, opLog) -> { + allRunFor( + spec, + sender.authorizeContract(airdropContract), + sender.associateTokens(nft), + nft.treasury().transferNFTsTo(sender, nft, 1L), + associatedReceiver.associateTokens(nft), + notAssociatedReceiver + .getBalance() + .andAssert(balance -> balance.hasTokenBalance(nft.name(), 0L))); + allRunFor( + spec, + // Airdrop the same nft serial to the same account + // when the account is already associated with the nft we don't get a pending airdrop + // so when we try to do so with a single airdrop it will fail with + // TOKEN_ID_REPEATED_IN_TOKEN_LIST + airdropContract + .call( + "nftNAmountAirdrops", + prepareTokenAddresses(spec, nft, nft, nft), + prepareContractAddresses(spec, sender, sender, sender), + prepareAccountAddresses( + spec, associatedReceiver, associatedReceiver, associatedReceiver), + new long[] {1L, 1L, 1L}) + .sending(85_000_000L) + .gas(1_500_000L) + .andAssert(txn -> txn.hasKnownStatuses( + CONTRACT_REVERT_EXECUTED, TOKEN_ID_REPEATED_IN_TOKEN_LIST))); + allRunFor( + spec, + // We validate the same case but with an account that is not associated with the nft + airdropContract + .call( + "nftNAmountAirdrops", + prepareTokenAddresses(spec, nft, nft, nft), + prepareContractAddresses(spec, sender, sender, sender), + prepareAccountAddresses( + spec, + notAssociatedReceiver, + notAssociatedReceiver, + notAssociatedReceiver), + new long[] {1L, 1L, 1L}) + .sending(85_000_000L) + .gas(1_500_000L) + .andAssert(txn -> txn.hasKnownStatuses( + CONTRACT_REVERT_EXECUTED, TOKEN_ID_REPEATED_IN_TOKEN_LIST))); + allRunFor( + spec, + // Now we airdrop a single to the same account to go to the pending airdrop list + airdropContract + .call("nftAirdrop", nft, sender, notAssociatedReceiver, 1L) + .sending(85_000_000L) + .gas(1_500_000L) + .via("AirdropToPendingState"), + getTxnRecord("AirdropToPendingState") + .hasChildRecords(recordWith() + .pendingAirdrops(includingNftPendingAirdrop(movingUnique(nft.name(), 1L) + .between(sender.name(), notAssociatedReceiver.name()))))); + allRunFor( + spec, + // Now we try to airdrop the same nft serial to the same account that should fail with + // PENDING_NFT_AIRDROP_ALREADY_EXISTS + airdropContract + .call("nftAirdrop", nft, sender, notAssociatedReceiver, 1L) + .sending(85_000_000L) + .gas(1_500_000L) + .andAssert(txn -> txn.hasKnownStatuses( + CONTRACT_REVERT_EXECUTED, PENDING_NFT_AIRDROP_ALREADY_EXISTS))); + })); + } + + @HapiTest + @DisplayName( + "Airdrop token amount of Long.MAX_VALUE then try to airdrop 1 more token to the same receiver should fail") + public Stream airdropMaxLongPlusOneShouldFail( + @NonNull @FungibleToken(initialSupply = Long.MAX_VALUE) final SpecFungibleToken token, + @NonNull @Contract(contract = "EmptyOne", creationGas = 100_000_000L) final SpecContract sender, + @NonNull @Account(maxAutoAssociations = 1, tinybarBalance = 100L) final SpecAccount receiver) { + return hapiTest(withOpContext((spec, opLog) -> { + allRunFor( + spec, + sender.authorizeContract(airdropContract), + sender.associateTokens(token), + token.treasury().transferUnitsTo(sender, Long.MAX_VALUE, token)); + allRunFor( + spec, + airdropContract + .call("tokenAirdrop", token, sender, receiver, Long.MAX_VALUE) + .sending(85_000_000L) + .gas(1_500_000L)); + allRunFor( + spec, + receiver.getBalance() + .andAssert(balance -> balance.hasTokenBalance(token.name(), Long.MAX_VALUE))); + allRunFor( + spec, + airdropContract + .call("tokenAirdrop", token, sender, receiver, 1L) + .sending(85_000_000L) + .gas(1_500_000L) + .andAssert(txn -> + txn.hasKnownStatuses(CONTRACT_REVERT_EXECUTED, INSUFFICIENT_TOKEN_BALANCE))); + })); + } + + @HapiTest + @DisplayName("Contract tries to airdrop a token to itself") + public Stream airdropTokenToItself( + @NonNull @FungibleToken(initialSupply = 1_000_000L) final SpecFungibleToken token, + @NonNull @Contract(contract = "EmptyOne", creationGas = 10_000_000L) final SpecContract sender) { + return hapiTest(withOpContext((spec, opLog) -> { + allRunFor( + spec, + sender.authorizeContract(airdropContract), + sender.associateTokens(token), + token.treasury().transferUnitsTo(sender, 1_000L, token)); + allRunFor( + spec, + airdropContract + .call("tokenAirdrop", token, sender, sender, 10L) + .sending(85_000_000L) + .gas(1_500_000L) + .andAssert(txn -> txn.hasKnownStatuses( + CONTRACT_REVERT_EXECUTED, ACCOUNT_REPEATED_IN_ACCOUNT_AMOUNTS))); + })); + } + + @HapiTest + @DisplayName("Contract airdrops to a pending state then tries to SELFDESTRUCT") + public Stream contractAirdropsThenSelfdestructs( + @NonNull @FungibleToken(initialSupply = 100) final SpecFungibleToken token, + @NonNull @Contract(contract = "EmptyOne", creationGas = 100_000_000L) final SpecContract contract, + @NonNull @Account(maxAutoAssociations = 0, tinybarBalance = 100L) final SpecAccount receiver) { + return hapiTest(withOpContext((spec, opLog) -> { + allRunFor( + spec, + contract.authorizeContract(airdropContract), + contract.associateTokens(token), + token.treasury().transferUnitsTo(contract, 100, token)); + allRunFor( + spec, + airdropContract + .call("tokenAirdrop", token, contract, receiver, 10L) + .sending(85_000_000L) + .gas(1_500_000L) + .via("pendingAirdropTxn"), + getTxnRecord("pendingAirdropTxn") + .hasChildRecords(recordWith() + .pendingAirdrops( + includingFungiblePendingAirdrop(TokenMovement.moving(10L, token.name()) + .between(contract.name(), receiver.name()))))); + allRunFor( + spec, + contractDelete(contract.name()) + .hasKnownStatusFrom(CONTRACT_REVERT_EXECUTED, ACCOUNT_HAS_PENDING_AIRDROPS)); + })); + } + } } diff --git a/hedera-node/test-clients/src/main/resources/contract/contracts/Airdrop/Airdrop.bin b/hedera-node/test-clients/src/main/resources/contract/contracts/Airdrop/Airdrop.bin index 9adbb7256197..2689c718f193 100644 --- a/hedera-node/test-clients/src/main/resources/contract/contracts/Airdrop/Airdrop.bin +++ b/hedera-node/test-clients/src/main/resources/contract/contracts/Airdrop/Airdrop.bin @@ -1 +1 @@ -608060405234801561001057600080fd5b50612bbd806100206000396000f3fe60806040526004361061009c5760003560e01c80638a96eca8116100645780638a96eca8146101ac578063913073f9146101dc5780639b23d3d91461020c5780639ef773bf14610249578063ba7ee6e514610279578063e6c6ac4c146102a95761009c565b806315dacbea146100a15780631b79e5f9146100de57806352c0d7d41461010e578063618dc65e1461013e5780637da131bf1461017c575b600080fd5b3480156100ad57600080fd5b506100c860048036038101906100c39190611b1e565b6102e6565b6040516100d59190611ba1565b60405180910390f35b6100f860048036038101906100f39190611be8565b610404565b6040516101059190611ba1565b60405180910390f35b61012860048036038101906101239190611be8565b6104f9565b6040516101359190611ba1565b60405180910390f35b34801561014a57600080fd5b5061016560048036038101906101609190611d95565b61066e565b604051610173929190611e89565b60405180910390f35b61019660048036038101906101919190611f81565b6107ca565b6040516101a39190611ba1565b60405180910390f35b6101c660048036038101906101c1919061203c565b610931565b6040516101d39190611ba1565b60405180910390f35b6101f660048036038101906101f191906120db565b610c28565b6040516102039190611ba1565b60405180910390f35b34801561021857600080fd5b50610233600480360381019061022e9190611b1e565b610eda565b6040516102409190611ba1565b60405180910390f35b610263600480360381019061025e9190612221565b610ff8565b6040516102709190611ba1565b60405180910390f35b610293600480360381019061028e919061239b565b6112f9565b6040516102a09190611ba1565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb919061240a565b6114ba565b6040516102dd9190611ba1565b60405180910390f35b600080600061016773ffffffffffffffffffffffffffffffffffffffff166315dacbea60e01b8888888860405160240161032394939291906124ff565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161038d9190612580565b6000604051808303816000865af19150503d80600081146103ca576040519150601f19603f3d011682016040523d82523d6000602084013e6103cf565b606091505b5091509150816103e05760156103f5565b808060200190518101906103f491906125d0565b5b60030b92505050949350505050565b600080600167ffffffffffffffff81111561042257610421611c6a565b5b60405190808252806020026020018201604052801561045b57816020015b6104486119aa565b8152602001906001900390816104405790505b5090506104666119aa565b86816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506104a98686866116b5565b816020018190525080826000815181106104c6576104c56125fd565b5b60200260200101819052506104da82611804565b9250601660030b8360070b146104ef57600080fd5b5050949350505050565b600080600167ffffffffffffffff81111561051757610516611c6a565b5b60405190808252806020026020018201604052801561055057816020015b61053d6119aa565b8152602001906001900390816105355790505b50905061055b6119aa565b86816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006105a0878787611919565b90506000600167ffffffffffffffff8111156105bf576105be611c6a565b5b6040519080825280602002602001820160405280156105f857816020015b6105e56119e1565b8152602001906001900390816105dd5790505b50905081816000815181106106105761060f6125fd565b5b60200260200101819052508083604001819052508284600081518110610639576106386125fd565b5b602002602001018190525061064d84611804565b9450601660030b8560070b1461066257600080fd5b50505050949350505050565b6000606060008061016773ffffffffffffffffffffffffffffffffffffffff1663618dc65e60e01b87876040516024016106a992919061262c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516107139190612580565b6000604051808303816000865af19150503d8060008114610750576040519150601f19603f3d011682016040523d82523d6000602084013e610755565b606091505b50915091507f4af4780e06fe8cb9df64b0794fa6f01399af979175bb988e35e0e57e594567bc828260405161078b929190612677565b60405180910390a1816107af576015604051806020016040528060008152506107b3565b6016815b8160030b9150809450819550505050509250929050565b6000808451905060008167ffffffffffffffff8111156107ed576107ec611c6a565b5b60405190808252806020026020018201604052801561082657816020015b6108136119aa565b81526020019060019003908161080b5790505b50905060005b828110156109085761083c6119aa565b88828151811061084f5761084e6125fd565b5b6020026020010151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506108cd8883815181106108a4576108a36125fd565b5b60200260200101518884815181106108bf576108be6125fd565b5b6020026020010151886116b5565b8160200181905250808383815181106108e9576108e86125fd565b5b6020026020010181905250508080610900906126d6565b91505061082c565b5061091281611804565b9250601660030b8360070b1461092757600080fd5b5050949350505050565b6000808551905060008167ffffffffffffffff81111561095457610953611c6a565b5b60405190808252806020026020018201604052801561098d57816020015b61097a6119aa565b8152602001906001900390816109725790505b50905060005b82811015610bff576109a36119aa565b8882815181106109b6576109b56125fd565b5b6020026020010151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506109fd611a3a565b88816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000885190506000805b82811015610a68578982610a53919061271e565b91508080610a60906126d6565b915050610a3f565b5080610a739061277e565b836020019060070b908160070b815250506000600183610a9391906127c6565b67ffffffffffffffff811115610aac57610aab611c6a565b5b604051908082528060200260200182016040528015610ae557816020015b610ad2611a3a565b815260200190600190039081610aca5790505b5090508381600081518110610afd57610afc6125fd565b5b602002602001018190525060005b83811015610bbe57610b1b611a3a565b8c8281518110610b2e57610b2d6125fd565b5b6020026020010151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816020019060070b908160070b815250508083600184610b8e91906127c6565b81518110610b9f57610b9e6125fd565b5b6020026020010181905250508080610bb6906126d6565b915050610b0b565b5080856020018190525084878781518110610bdc57610bdb6125fd565b5b602002602001018190525050505050508080610bf7906126d6565b915050610993565b50610c0981611804565b9250601660030b8360070b14610c1e57600080fd5b5050949350505050565b60008060018451610c3991906127c6565b90506000600167ffffffffffffffff811115610c5857610c57611c6a565b5b604051908082528060200260200182016040528015610c9157816020015b610c7e6119aa565b815260200190600190039081610c765790505b509050610c9c6119aa565b87816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610cdc611a3a565b87816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000805b8851811015610d42578782610d2d919061271e565b91508080610d3a906126d6565b915050610d18565b5080610d4d9061277e565b826020019060070b908160070b8152505060008567ffffffffffffffff811115610d7a57610d79611c6a565b5b604051908082528060200260200182016040528015610db357816020015b610da0611a3a565b815260200190600190039081610d985790505b5090508281600081518110610dcb57610dca6125fd565b5b60200260200101819052506000600190505b86811015610e8457610ded611a3a565b8a8281518110610e0057610dff6125fd565b5b6020026020010151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505089816020019060070b908160070b8152505080838381518110610e6557610e646125fd565b5b6020026020010181905250508080610e7c906126d6565b915050610ddd565b508084602001819052508385600081518110610ea357610ea26125fd565b5b6020026020010181905250610eb785611804565b9650601660030b8760070b14610ecc57600080fd5b505050505050949350505050565b600080600061016773ffffffffffffffffffffffffffffffffffffffff16639b23d3d960e01b88888888604051602401610f1794939291906124ff565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610f819190612580565b6000604051808303816000865af19150503d8060008114610fbe576040519150601f19603f3d011682016040523d82523d6000602084013e610fc3565b606091505b509150915081610fd4576015610fe9565b80806020019051810190610fe891906125d0565b5b60030b92505050949350505050565b6000808551885161100991906127c6565b905060008167ffffffffffffffff81111561102757611026611c6a565b5b60405190808252806020026020018201604052801561106057816020015b61104d6119aa565b8152602001906001900390816110455790505b50905060005b8951811015611143576110776119aa565b8c828151811061108a576110896125fd565b5b6020026020010151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506111088b83815181106110df576110de6125fd565b5b60200260200101518b84815181106110fa576110f96125fd565b5b6020026020010151896116b5565b816020018190525080838381518110611124576111236125fd565b5b602002602001018190525050808061113b906126d6565b915050611066565b5060008951905060005b838210156112cb5761115d6119aa565b8c82815181106111705761116f6125fd565b5b6020026020010151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600167ffffffffffffffff8111156111cc576111cb611c6a565b5b60405190808252806020026020018201604052801561120557816020015b6111f26119e1565b8152602001906001900390816111ea5790505b5090506112618b848151811061121e5761121d6125fd565b5b60200260200101518b8581518110611239576112386125fd565b5b60200260200101518a8681518110611254576112536125fd565b5b6020026020010151611919565b81600081518110611275576112746125fd565b5b60200260200101819052508082604001819052508185858151811061129d5761129c6125fd565b5b602002602001018190525083806112b3906126d6565b945050505080806112c3906126d6565b91505061114d565b506112d582611804565b9350601660030b8460070b146112ea57600080fd5b50505098975050505050505050565b600080825190506000600167ffffffffffffffff81111561131d5761131c611c6a565b5b60405190808252806020026020018201604052801561135657816020015b6113436119aa565b81526020019060019003908161133b5790505b5090506113616119aa565b86816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008367ffffffffffffffff8111156113b5576113b4611c6a565b5b6040519080825280602002602001820160405280156113ee57816020015b6113db6119e1565b8152602001906001900390816113d35790505b50905060006001905060005b858110156114665761142789898381518110611419576114186125fd565b5b602002602001015184611919565b83828151811061143a576114396125fd565b5b60200260200101819052508180611450906127fa565b925050808061145e906126d6565b9150506113fa565b508183604001819052508284600081518110611485576114846125fd565b5b602002602001018190525061149984611804565b9550601660030b8660070b146114ae57600080fd5b50505050509392505050565b6000808551905060008167ffffffffffffffff8111156114dd576114dc611c6a565b5b60405190808252806020026020018201604052801561151657816020015b6115036119aa565b8152602001906001900390816114fb5790505b50905060005b8281101561168c5761152c6119aa565b88828151811061153f5761153e6125fd565b5b6020026020010151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600167ffffffffffffffff81111561159b5761159a611c6a565b5b6040519080825280602002602001820160405280156115d457816020015b6115c16119e1565b8152602001906001900390816115b95790505b5090506116308984815181106115ed576115ec6125fd565b5b6020026020010151898581518110611608576116076125fd565b5b6020026020010151898681518110611623576116226125fd565b5b6020026020010151611919565b81600081518110611644576116436125fd565b5b60200260200101819052508082604001819052508184848151811061166c5761166b6125fd565b5b602002602001018190525050508080611684906126d6565b91505061151c565b5061169681611804565b9250601660030b8360070b146116ab57600080fd5b5050949350505050565b60606116bf611a3a565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050826117019061277e565b816020019060070b908160070b8152505061171a611a3a565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083816020019060070b908160070b81525050600267ffffffffffffffff81111561177f5761177e611c6a565b5b6040519080825280602002602001820160405280156117b857816020015b6117a5611a3a565b81526020019060019003908161179d5790505b50925081836000815181106117d0576117cf6125fd565b5b602002602001018190525080836001815181106117f0576117ef6125fd565b5b602002602001018190525050509392505050565b600080600061016773ffffffffffffffffffffffffffffffffffffffff16632f34811960e01b8560405160240161183b9190612b65565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516118a59190612580565b6000604051808303816000865af19150503d80600081146118e2576040519150601f19603f3d011682016040523d82523d6000602084013e6118e7565b606091505b5091509150816118f857601561190d565b8080602001905181019061190c91906125d0565b5b60030b92505050919050565b6119216119e1565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081816040019060070b908160070b815250509392505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600060070b81526020016000151581525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600060070b81526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611ab582611a8a565b9050919050565b611ac581611aaa565b8114611ad057600080fd5b50565b600081359050611ae281611abc565b92915050565b6000819050919050565b611afb81611ae8565b8114611b0657600080fd5b50565b600081359050611b1881611af2565b92915050565b60008060008060808587031215611b3857611b37611a80565b5b6000611b4687828801611ad3565b9450506020611b5787828801611ad3565b9350506040611b6887828801611ad3565b9250506060611b7987828801611b09565b91505092959194509250565b60008160070b9050919050565b611b9b81611b85565b82525050565b6000602082019050611bb66000830184611b92565b92915050565b611bc581611b85565b8114611bd057600080fd5b50565b600081359050611be281611bbc565b92915050565b60008060008060808587031215611c0257611c01611a80565b5b6000611c1087828801611ad3565b9450506020611c2187828801611ad3565b9350506040611c3287828801611ad3565b9250506060611c4387828801611bd3565b91505092959194509250565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ca282611c59565b810181811067ffffffffffffffff82111715611cc157611cc0611c6a565b5b80604052505050565b6000611cd4611a76565b9050611ce08282611c99565b919050565b600067ffffffffffffffff821115611d0057611cff611c6a565b5b611d0982611c59565b9050602081019050919050565b82818337600083830152505050565b6000611d38611d3384611ce5565b611cca565b905082815260208101848484011115611d5457611d53611c54565b5b611d5f848285611d16565b509392505050565b600082601f830112611d7c57611d7b611c4f565b5b8135611d8c848260208601611d25565b91505092915050565b60008060408385031215611dac57611dab611a80565b5b6000611dba85828601611ad3565b925050602083013567ffffffffffffffff811115611ddb57611dda611a85565b5b611de785828601611d67565b9150509250929050565b6000819050919050565b611e0481611df1565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e44578082015181840152602081019050611e29565b60008484015250505050565b6000611e5b82611e0a565b611e658185611e15565b9350611e75818560208601611e26565b611e7e81611c59565b840191505092915050565b6000604082019050611e9e6000830185611dfb565b8181036020830152611eb08184611e50565b90509392505050565b600067ffffffffffffffff821115611ed457611ed3611c6a565b5b602082029050602081019050919050565b600080fd5b6000611efd611ef884611eb9565b611cca565b90508083825260208201905060208402830185811115611f2057611f1f611ee5565b5b835b81811015611f495780611f358882611ad3565b845260208401935050602081019050611f22565b5050509392505050565b600082601f830112611f6857611f67611c4f565b5b8135611f78848260208601611eea565b91505092915050565b60008060008060808587031215611f9b57611f9a611a80565b5b600085013567ffffffffffffffff811115611fb957611fb8611a85565b5b611fc587828801611f53565b945050602085013567ffffffffffffffff811115611fe657611fe5611a85565b5b611ff287828801611f53565b935050604085013567ffffffffffffffff81111561201357612012611a85565b5b61201f87828801611f53565b925050606061203087828801611bd3565b91505092959194509250565b6000806000806080858703121561205657612055611a80565b5b600085013567ffffffffffffffff81111561207457612073611a85565b5b61208087828801611f53565b945050602061209187828801611ad3565b935050604085013567ffffffffffffffff8111156120b2576120b1611a85565b5b6120be87828801611f53565b92505060606120cf87828801611bd3565b91505092959194509250565b600080600080608085870312156120f5576120f4611a80565b5b600061210387828801611ad3565b945050602061211487828801611ad3565b935050604085013567ffffffffffffffff81111561213557612134611a85565b5b61214187828801611f53565b925050606061215287828801611bd3565b91505092959194509250565b600067ffffffffffffffff82111561217957612178611c6a565b5b602082029050602081019050919050565b600061219d6121988461215e565b611cca565b905080838252602082019050602084028301858111156121c0576121bf611ee5565b5b835b818110156121e957806121d58882611bd3565b8452602084019350506020810190506121c2565b5050509392505050565b600082601f83011261220857612207611c4f565b5b813561221884826020860161218a565b91505092915050565b600080600080600080600080610100898b03121561224257612241611a80565b5b600089013567ffffffffffffffff8111156122605761225f611a85565b5b61226c8b828c01611f53565b985050602089013567ffffffffffffffff81111561228d5761228c611a85565b5b6122998b828c01611f53565b975050604089013567ffffffffffffffff8111156122ba576122b9611a85565b5b6122c68b828c01611f53565b965050606089013567ffffffffffffffff8111156122e7576122e6611a85565b5b6122f38b828c01611f53565b955050608089013567ffffffffffffffff81111561231457612313611a85565b5b6123208b828c01611f53565b94505060a089013567ffffffffffffffff81111561234157612340611a85565b5b61234d8b828c01611f53565b93505060c061235e8b828c01611bd3565b92505060e089013567ffffffffffffffff81111561237f5761237e611a85565b5b61238b8b828c016121f3565b9150509295985092959890939650565b6000806000606084860312156123b4576123b3611a80565b5b60006123c286828701611ad3565b93505060206123d386828701611ad3565b925050604084013567ffffffffffffffff8111156123f4576123f3611a85565b5b61240086828701611f53565b9150509250925092565b6000806000806080858703121561242457612423611a80565b5b600085013567ffffffffffffffff81111561244257612441611a85565b5b61244e87828801611f53565b945050602085013567ffffffffffffffff81111561246f5761246e611a85565b5b61247b87828801611f53565b935050604085013567ffffffffffffffff81111561249c5761249b611a85565b5b6124a887828801611f53565b925050606085013567ffffffffffffffff8111156124c9576124c8611a85565b5b6124d5878288016121f3565b91505092959194509250565b6124ea81611aaa565b82525050565b6124f981611ae8565b82525050565b600060808201905061251460008301876124e1565b61252160208301866124e1565b61252e60408301856124e1565b61253b60608301846124f0565b95945050505050565b600081905092915050565b600061255a82611e0a565b6125648185612544565b9350612574818560208601611e26565b80840191505092915050565b600061258c828461254f565b915081905092915050565b60008160030b9050919050565b6125ad81612597565b81146125b857600080fd5b50565b6000815190506125ca816125a4565b92915050565b6000602082840312156125e6576125e5611a80565b5b60006125f4848285016125bb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060408201905061264160008301856124e1565b81810360208301526126538184611e50565b90509392505050565b60008115159050919050565b6126718161265c565b82525050565b600060408201905061268c6000830185612668565b818103602083015261269e8184611e50565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126e182611ae8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612713576127126126a7565b5b600182019050919050565b600061272982611b85565b915061273483611b85565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff82131715612778576127776126a7565b5b92915050565b600061278982611b85565b91507fffffffffffffffffffffffffffffffffffffffffffffffff800000000000000082036127bb576127ba6126a7565b5b816000039050919050565b60006127d182611ae8565b91506127dc83611ae8565b92508282019050808211156127f4576127f36126a7565b5b92915050565b600061280582611b85565b9150677fffffffffffffff820361281f5761281e6126a7565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61285f81611aaa565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61289a81611b85565b82525050565b6128a98161265c565b82525050565b6060820160008201516128c56000850182612856565b5060208201516128d86020850182612891565b5060408201516128eb60408501826128a0565b50505050565b60006128fd83836128af565b60608301905092915050565b6000602082019050919050565b600061292182612865565b61292b8185612870565b935061293683612881565b8060005b8381101561296757815161294e88826128f1565b975061295983612909565b92505060018101905061293a565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6080820160008201516129b66000850182612856565b5060208201516129c96020850182612856565b5060408201516129dc6040850182612891565b5060608201516129ef60608501826128a0565b50505050565b6000612a0183836129a0565b60808301905092915050565b6000602082019050919050565b6000612a2582612974565b612a2f818561297f565b9350612a3a83612990565b8060005b83811015612a6b578151612a5288826129f5565b9750612a5d83612a0d565b925050600181019050612a3e565b5085935050505092915050565b6000606083016000830151612a906000860182612856565b5060208301518482036020860152612aa88282612916565b91505060408301518482036040860152612ac28282612a1a565b9150508091505092915050565b6000612adb8383612a78565b905092915050565b6000602082019050919050565b6000612afb8261282a565b612b058185612835565b935083602082028501612b1785612846565b8060005b85811015612b535784840389528151612b348582612acf565b9450612b3f83612ae3565b925060208a01995050600181019050612b1b565b50829750879550505050505092915050565b60006020820190508181036000830152612b7f8184612af0565b90509291505056fea2646970667358221220f5c5743bc121bb9c07222745c48732c36fbf4509eeec4e857ec0af026da1eb3564736f6c63430008120033 \ No newline at end of file +608060405234801561001057600080fd5b50612bb0806100206000396000f3fe60806040526004361061009c5760003560e01c80638a96eca8116100645780638a96eca8146101ac578063913073f9146101dc5780639b23d3d91461020c5780639ef773bf14610249578063ba7ee6e514610279578063e6c6ac4c146102a95761009c565b806315dacbea146100a15780631b79e5f9146100de57806352c0d7d41461010e578063618dc65e1461013e5780637da131bf1461017c575b600080fd5b3480156100ad57600080fd5b506100c860048036038101906100c39190611b11565b6102d9565b6040516100d59190611b94565b60405180910390f35b6100f860048036038101906100f39190611bdb565b6103f7565b6040516101059190611b94565b60405180910390f35b61012860048036038101906101239190611bdb565b6104ec565b6040516101359190611b94565b60405180910390f35b34801561014a57600080fd5b5061016560048036038101906101609190611d88565b610661565b604051610173929190611e7c565b60405180910390f35b61019660048036038101906101919190611f74565b6107bd565b6040516101a39190611b94565b60405180910390f35b6101c660048036038101906101c1919061202f565b610924565b6040516101d39190611b94565b60405180910390f35b6101f660048036038101906101f191906120ce565b610c1b565b6040516102039190611b94565b60405180910390f35b34801561021857600080fd5b50610233600480360381019061022e9190611b11565b610ecd565b6040516102409190611b94565b60405180910390f35b610263600480360381019061025e9190612214565b610feb565b6040516102709190611b94565b60405180910390f35b610293600480360381019061028e919061238e565b6112ec565b6040516102a09190611b94565b60405180910390f35b6102c360048036038101906102be91906123fd565b6114ad565b6040516102d09190611b94565b60405180910390f35b600080600061016773ffffffffffffffffffffffffffffffffffffffff166315dacbea60e01b8888888860405160240161031694939291906124f2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516103809190612573565b6000604051808303816000865af19150503d80600081146103bd576040519150601f19603f3d011682016040523d82523d6000602084013e6103c2565b606091505b5091509150816103d35760156103e8565b808060200190518101906103e791906125c3565b5b60030b92505050949350505050565b600080600167ffffffffffffffff81111561041557610414611c5d565b5b60405190808252806020026020018201604052801561044e57816020015b61043b61199d565b8152602001906001900390816104335790505b50905061045961199d565b86816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061049c8686866116a8565b816020018190525080826000815181106104b9576104b86125f0565b5b60200260200101819052506104cd826117f7565b9250601660030b8360070b146104e257600080fd5b5050949350505050565b600080600167ffffffffffffffff81111561050a57610509611c5d565b5b60405190808252806020026020018201604052801561054357816020015b61053061199d565b8152602001906001900390816105285790505b50905061054e61199d565b86816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600061059387878761190c565b90506000600167ffffffffffffffff8111156105b2576105b1611c5d565b5b6040519080825280602002602001820160405280156105eb57816020015b6105d86119d4565b8152602001906001900390816105d05790505b5090508181600081518110610603576106026125f0565b5b6020026020010181905250808360400181905250828460008151811061062c5761062b6125f0565b5b6020026020010181905250610640846117f7565b9450601660030b8560070b1461065557600080fd5b50505050949350505050565b6000606060008061016773ffffffffffffffffffffffffffffffffffffffff1663618dc65e60e01b878760405160240161069c92919061261f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516107069190612573565b6000604051808303816000865af19150503d8060008114610743576040519150601f19603f3d011682016040523d82523d6000602084013e610748565b606091505b50915091507f4af4780e06fe8cb9df64b0794fa6f01399af979175bb988e35e0e57e594567bc828260405161077e92919061266a565b60405180910390a1816107a2576015604051806020016040528060008152506107a6565b6016815b8160030b9150809450819550505050509250929050565b6000808451905060008167ffffffffffffffff8111156107e0576107df611c5d565b5b60405190808252806020026020018201604052801561081957816020015b61080661199d565b8152602001906001900390816107fe5790505b50905060005b828110156108fb5761082f61199d565b888281518110610842576108416125f0565b5b6020026020010151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506108c0888381518110610897576108966125f0565b5b60200260200101518884815181106108b2576108b16125f0565b5b6020026020010151886116a8565b8160200181905250808383815181106108dc576108db6125f0565b5b60200260200101819052505080806108f3906126c9565b91505061081f565b50610905816117f7565b9250601660030b8360070b1461091a57600080fd5b5050949350505050565b6000808551905060008167ffffffffffffffff81111561094757610946611c5d565b5b60405190808252806020026020018201604052801561098057816020015b61096d61199d565b8152602001906001900390816109655790505b50905060005b82811015610bf25761099661199d565b8882815181106109a9576109a86125f0565b5b6020026020010151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506109f0611a2d565b88816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000885190506000805b82811015610a5b578982610a469190612711565b91508080610a53906126c9565b915050610a32565b5080610a6690612771565b836020019060070b908160070b815250506000600183610a8691906127b9565b67ffffffffffffffff811115610a9f57610a9e611c5d565b5b604051908082528060200260200182016040528015610ad857816020015b610ac5611a2d565b815260200190600190039081610abd5790505b5090508381600081518110610af057610aef6125f0565b5b602002602001018190525060005b83811015610bb157610b0e611a2d565b8c8281518110610b2157610b206125f0565b5b6020026020010151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816020019060070b908160070b815250508083600184610b8191906127b9565b81518110610b9257610b916125f0565b5b6020026020010181905250508080610ba9906126c9565b915050610afe565b5080856020018190525084878781518110610bcf57610bce6125f0565b5b602002602001018190525050505050508080610bea906126c9565b915050610986565b50610bfc816117f7565b9250601660030b8360070b14610c1157600080fd5b5050949350505050565b60008060018451610c2c91906127b9565b90506000600167ffffffffffffffff811115610c4b57610c4a611c5d565b5b604051908082528060200260200182016040528015610c8457816020015b610c7161199d565b815260200190600190039081610c695790505b509050610c8f61199d565b87816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610ccf611a2d565b87816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000805b8851811015610d35578782610d209190612711565b91508080610d2d906126c9565b915050610d0b565b5080610d4090612771565b826020019060070b908160070b8152505060008567ffffffffffffffff811115610d6d57610d6c611c5d565b5b604051908082528060200260200182016040528015610da657816020015b610d93611a2d565b815260200190600190039081610d8b5790505b5090508281600081518110610dbe57610dbd6125f0565b5b60200260200101819052506000600190505b86811015610e7757610de0611a2d565b8a8281518110610df357610df26125f0565b5b6020026020010151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505089816020019060070b908160070b8152505080838381518110610e5857610e576125f0565b5b6020026020010181905250508080610e6f906126c9565b915050610dd0565b508084602001819052508385600081518110610e9657610e956125f0565b5b6020026020010181905250610eaa856117f7565b9650601660030b8760070b14610ebf57600080fd5b505050505050949350505050565b600080600061016773ffffffffffffffffffffffffffffffffffffffff16639b23d3d960e01b88888888604051602401610f0a94939291906124f2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610f749190612573565b6000604051808303816000865af19150503d8060008114610fb1576040519150601f19603f3d011682016040523d82523d6000602084013e610fb6565b606091505b509150915081610fc7576015610fdc565b80806020019051810190610fdb91906125c3565b5b60030b92505050949350505050565b60008085518851610ffc91906127b9565b905060008167ffffffffffffffff81111561101a57611019611c5d565b5b60405190808252806020026020018201604052801561105357816020015b61104061199d565b8152602001906001900390816110385790505b50905060005b89518110156111365761106a61199d565b8c828151811061107d5761107c6125f0565b5b6020026020010151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506110fb8b83815181106110d2576110d16125f0565b5b60200260200101518b84815181106110ed576110ec6125f0565b5b6020026020010151896116a8565b816020018190525080838381518110611117576111166125f0565b5b602002602001018190525050808061112e906126c9565b915050611059565b5060008951905060005b838210156112be5761115061199d565b8c8281518110611163576111626125f0565b5b6020026020010151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600167ffffffffffffffff8111156111bf576111be611c5d565b5b6040519080825280602002602001820160405280156111f857816020015b6111e56119d4565b8152602001906001900390816111dd5790505b5090506112548b8481518110611211576112106125f0565b5b60200260200101518b858151811061122c5761122b6125f0565b5b60200260200101518a8681518110611247576112466125f0565b5b602002602001015161190c565b81600081518110611268576112676125f0565b5b6020026020010181905250808260400181905250818585815181106112905761128f6125f0565b5b602002602001018190525083806112a6906126c9565b945050505080806112b6906126c9565b915050611140565b506112c8826117f7565b9350601660030b8460070b146112dd57600080fd5b50505098975050505050505050565b600080825190506000600167ffffffffffffffff8111156113105761130f611c5d565b5b60405190808252806020026020018201604052801561134957816020015b61133661199d565b81526020019060019003908161132e5790505b50905061135461199d565b86816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008367ffffffffffffffff8111156113a8576113a7611c5d565b5b6040519080825280602002602001820160405280156113e157816020015b6113ce6119d4565b8152602001906001900390816113c65790505b50905060006001905060005b858110156114595761141a8989838151811061140c5761140b6125f0565b5b60200260200101518461190c565b83828151811061142d5761142c6125f0565b5b60200260200101819052508180611443906127ed565b9250508080611451906126c9565b9150506113ed565b508183604001819052508284600081518110611478576114776125f0565b5b602002602001018190525061148c846117f7565b9550601660030b8660070b146114a157600080fd5b50505050509392505050565b6000808551905060008167ffffffffffffffff8111156114d0576114cf611c5d565b5b60405190808252806020026020018201604052801561150957816020015b6114f661199d565b8152602001906001900390816114ee5790505b50905060005b8281101561167f5761151f61199d565b888281518110611532576115316125f0565b5b6020026020010151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600167ffffffffffffffff81111561158e5761158d611c5d565b5b6040519080825280602002602001820160405280156115c757816020015b6115b46119d4565b8152602001906001900390816115ac5790505b5090506116238984815181106115e0576115df6125f0565b5b60200260200101518985815181106115fb576115fa6125f0565b5b6020026020010151898681518110611616576116156125f0565b5b602002602001015161190c565b81600081518110611637576116366125f0565b5b60200260200101819052508082604001819052508184848151811061165f5761165e6125f0565b5b602002602001018190525050508080611677906126c9565b91505061150f565b50611689816117f7565b9250601660030b8360070b1461169e57600080fd5b5050949350505050565b60606116b2611a2d565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050826116f490612771565b816020019060070b908160070b8152505061170d611a2d565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083816020019060070b908160070b81525050600267ffffffffffffffff81111561177257611771611c5d565b5b6040519080825280602002602001820160405280156117ab57816020015b611798611a2d565b8152602001906001900390816117905790505b50925081836000815181106117c3576117c26125f0565b5b602002602001018190525080836001815181106117e3576117e26125f0565b5b602002602001018190525050509392505050565b600080600061016773ffffffffffffffffffffffffffffffffffffffff16632f34811960e01b8560405160240161182e9190612b58565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516118989190612573565b6000604051808303816000865af19150503d80600081146118d5576040519150601f19603f3d011682016040523d82523d6000602084013e6118da565b606091505b5091509150816118eb576015611900565b808060200190518101906118ff91906125c3565b5b60030b92505050919050565b6119146119d4565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081816040019060070b908160070b815250509392505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600060070b81526020016000151581525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600060070b81526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611aa882611a7d565b9050919050565b611ab881611a9d565b8114611ac357600080fd5b50565b600081359050611ad581611aaf565b92915050565b6000819050919050565b611aee81611adb565b8114611af957600080fd5b50565b600081359050611b0b81611ae5565b92915050565b60008060008060808587031215611b2b57611b2a611a73565b5b6000611b3987828801611ac6565b9450506020611b4a87828801611ac6565b9350506040611b5b87828801611ac6565b9250506060611b6c87828801611afc565b91505092959194509250565b60008160070b9050919050565b611b8e81611b78565b82525050565b6000602082019050611ba96000830184611b85565b92915050565b611bb881611b78565b8114611bc357600080fd5b50565b600081359050611bd581611baf565b92915050565b60008060008060808587031215611bf557611bf4611a73565b5b6000611c0387828801611ac6565b9450506020611c1487828801611ac6565b9350506040611c2587828801611ac6565b9250506060611c3687828801611bc6565b91505092959194509250565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c9582611c4c565b810181811067ffffffffffffffff82111715611cb457611cb3611c5d565b5b80604052505050565b6000611cc7611a69565b9050611cd38282611c8c565b919050565b600067ffffffffffffffff821115611cf357611cf2611c5d565b5b611cfc82611c4c565b9050602081019050919050565b82818337600083830152505050565b6000611d2b611d2684611cd8565b611cbd565b905082815260208101848484011115611d4757611d46611c47565b5b611d52848285611d09565b509392505050565b600082601f830112611d6f57611d6e611c42565b5b8135611d7f848260208601611d18565b91505092915050565b60008060408385031215611d9f57611d9e611a73565b5b6000611dad85828601611ac6565b925050602083013567ffffffffffffffff811115611dce57611dcd611a78565b5b611dda85828601611d5a565b9150509250929050565b6000819050919050565b611df781611de4565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e37578082015181840152602081019050611e1c565b60008484015250505050565b6000611e4e82611dfd565b611e588185611e08565b9350611e68818560208601611e19565b611e7181611c4c565b840191505092915050565b6000604082019050611e916000830185611dee565b8181036020830152611ea38184611e43565b90509392505050565b600067ffffffffffffffff821115611ec757611ec6611c5d565b5b602082029050602081019050919050565b600080fd5b6000611ef0611eeb84611eac565b611cbd565b90508083825260208201905060208402830185811115611f1357611f12611ed8565b5b835b81811015611f3c5780611f288882611ac6565b845260208401935050602081019050611f15565b5050509392505050565b600082601f830112611f5b57611f5a611c42565b5b8135611f6b848260208601611edd565b91505092915050565b60008060008060808587031215611f8e57611f8d611a73565b5b600085013567ffffffffffffffff811115611fac57611fab611a78565b5b611fb887828801611f46565b945050602085013567ffffffffffffffff811115611fd957611fd8611a78565b5b611fe587828801611f46565b935050604085013567ffffffffffffffff81111561200657612005611a78565b5b61201287828801611f46565b925050606061202387828801611bc6565b91505092959194509250565b6000806000806080858703121561204957612048611a73565b5b600085013567ffffffffffffffff81111561206757612066611a78565b5b61207387828801611f46565b945050602061208487828801611ac6565b935050604085013567ffffffffffffffff8111156120a5576120a4611a78565b5b6120b187828801611f46565b92505060606120c287828801611bc6565b91505092959194509250565b600080600080608085870312156120e8576120e7611a73565b5b60006120f687828801611ac6565b945050602061210787828801611ac6565b935050604085013567ffffffffffffffff81111561212857612127611a78565b5b61213487828801611f46565b925050606061214587828801611bc6565b91505092959194509250565b600067ffffffffffffffff82111561216c5761216b611c5d565b5b602082029050602081019050919050565b600061219061218b84612151565b611cbd565b905080838252602082019050602084028301858111156121b3576121b2611ed8565b5b835b818110156121dc57806121c88882611bc6565b8452602084019350506020810190506121b5565b5050509392505050565b600082601f8301126121fb576121fa611c42565b5b813561220b84826020860161217d565b91505092915050565b600080600080600080600080610100898b03121561223557612234611a73565b5b600089013567ffffffffffffffff81111561225357612252611a78565b5b61225f8b828c01611f46565b985050602089013567ffffffffffffffff8111156122805761227f611a78565b5b61228c8b828c01611f46565b975050604089013567ffffffffffffffff8111156122ad576122ac611a78565b5b6122b98b828c01611f46565b965050606089013567ffffffffffffffff8111156122da576122d9611a78565b5b6122e68b828c01611f46565b955050608089013567ffffffffffffffff81111561230757612306611a78565b5b6123138b828c01611f46565b94505060a089013567ffffffffffffffff81111561233457612333611a78565b5b6123408b828c01611f46565b93505060c06123518b828c01611bc6565b92505060e089013567ffffffffffffffff81111561237257612371611a78565b5b61237e8b828c016121e6565b9150509295985092959890939650565b6000806000606084860312156123a7576123a6611a73565b5b60006123b586828701611ac6565b93505060206123c686828701611ac6565b925050604084013567ffffffffffffffff8111156123e7576123e6611a78565b5b6123f386828701611f46565b9150509250925092565b6000806000806080858703121561241757612416611a73565b5b600085013567ffffffffffffffff81111561243557612434611a78565b5b61244187828801611f46565b945050602085013567ffffffffffffffff81111561246257612461611a78565b5b61246e87828801611f46565b935050604085013567ffffffffffffffff81111561248f5761248e611a78565b5b61249b87828801611f46565b925050606085013567ffffffffffffffff8111156124bc576124bb611a78565b5b6124c8878288016121e6565b91505092959194509250565b6124dd81611a9d565b82525050565b6124ec81611adb565b82525050565b600060808201905061250760008301876124d4565b61251460208301866124d4565b61252160408301856124d4565b61252e60608301846124e3565b95945050505050565b600081905092915050565b600061254d82611dfd565b6125578185612537565b9350612567818560208601611e19565b80840191505092915050565b600061257f8284612542565b915081905092915050565b60008160030b9050919050565b6125a08161258a565b81146125ab57600080fd5b50565b6000815190506125bd81612597565b92915050565b6000602082840312156125d9576125d8611a73565b5b60006125e7848285016125ae565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060408201905061263460008301856124d4565b81810360208301526126468184611e43565b90509392505050565b60008115159050919050565b6126648161264f565b82525050565b600060408201905061267f600083018561265b565b81810360208301526126918184611e43565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126d482611adb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036127065761270561269a565b5b600182019050919050565b600061271c82611b78565b915061272783611b78565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff8213171561276b5761276a61269a565b5b92915050565b600061277c82611b78565b91507fffffffffffffffffffffffffffffffffffffffffffffffff800000000000000082036127ae576127ad61269a565b5b816000039050919050565b60006127c482611adb565b91506127cf83611adb565b92508282019050808211156127e7576127e661269a565b5b92915050565b60006127f882611b78565b9150677fffffffffffffff82036128125761281161269a565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61285281611a9d565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61288d81611b78565b82525050565b61289c8161264f565b82525050565b6060820160008201516128b86000850182612849565b5060208201516128cb6020850182612884565b5060408201516128de6040850182612893565b50505050565b60006128f083836128a2565b60608301905092915050565b6000602082019050919050565b600061291482612858565b61291e8185612863565b935061292983612874565b8060005b8381101561295a57815161294188826128e4565b975061294c836128fc565b92505060018101905061292d565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6080820160008201516129a96000850182612849565b5060208201516129bc6020850182612849565b5060408201516129cf6040850182612884565b5060608201516129e26060850182612893565b50505050565b60006129f48383612993565b60808301905092915050565b6000602082019050919050565b6000612a1882612967565b612a228185612972565b9350612a2d83612983565b8060005b83811015612a5e578151612a4588826129e8565b9750612a5083612a00565b925050600181019050612a31565b5085935050505092915050565b6000606083016000830151612a836000860182612849565b5060208301518482036020860152612a9b8282612909565b91505060408301518482036040860152612ab58282612a0d565b9150508091505092915050565b6000612ace8383612a6b565b905092915050565b6000602082019050919050565b6000612aee8261281d565b612af88185612828565b935083602082028501612b0a85612839565b8060005b85811015612b465784840389528151612b278582612ac2565b9450612b3283612ad6565b925060208a01995050600181019050612b0e565b50829750879550505050505092915050565b60006020820190508181036000830152612b728184612ae3565b90509291505056fea2646970667358221220761552a8d49fe397349157aae94d8b9b5a64eab5ebb82155d94113d46da836b164736f6c63430008120033 \ No newline at end of file diff --git a/hedera-node/test-clients/src/main/resources/contract/contracts/Airdrop/Airdrop.json b/hedera-node/test-clients/src/main/resources/contract/contracts/Airdrop/Airdrop.json index fea6a19f09e3..861993d52c33 100644 --- a/hedera-node/test-clients/src/main/resources/contract/contracts/Airdrop/Airdrop.json +++ b/hedera-node/test-clients/src/main/resources/contract/contracts/Airdrop/Airdrop.json @@ -200,7 +200,7 @@ "type": "int64" } ], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { diff --git a/hedera-node/test-clients/src/main/resources/contract/contracts/Airdrop/Airdrop.sol b/hedera-node/test-clients/src/main/resources/contract/contracts/Airdrop/Airdrop.sol index 9592c38f40c2..1e094e6d6c9d 100644 --- a/hedera-node/test-clients/src/main/resources/contract/contracts/Airdrop/Airdrop.sol +++ b/hedera-node/test-clients/src/main/resources/contract/contracts/Airdrop/Airdrop.sol @@ -53,7 +53,7 @@ contract Airdrop is HederaTokenService { return responseCode; } - function nftNAmountAirdrops(address[] memory nft, address[] memory senders, address[] memory receivers, int64[] memory serials) public returns (int64 responseCode) { + function nftNAmountAirdrops(address[] memory nft, address[] memory senders, address[] memory receivers, int64[] memory serials) public payable returns (int64 responseCode) { uint256 length = nft.length; IHederaTokenService.TokenTransferList[] memory tokenTransfers = new IHederaTokenService.TokenTransferList[](length); for (uint256 i = 0; i < length; i++)