From 471646e7aaa48d6ce4209a7892d230d3169fdd87 Mon Sep 17 00:00:00 2001 From: DivyaNautiyal07 Date: Tue, 30 Jun 2026 22:52:13 +0530 Subject: [PATCH 1/4] feat(offchain): wire mech-interact off-chain branch through Trader FSM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the off-chain branches from mech-interact v0.32.4-rc1 (PR #95 + PR #96 bugfixes) into trader. Default behaviour is unchanged — an operator opts in by flipping ``use_offchain: true`` in ``MECH_MARKETPLACE_CONFIG``. FSM wiring (composition.py): * FinishedOffchainMechRequestRound -> MechResponseRound (happy path: 200 from mech, skip on-chain settlement, poll HTTP) * FinishedOffchainMechDepositNeededRound -> PreTxSettlementRound (402: settle the auto-deposit via trader's existing refill-check gate; the deposit tx is bet-agnostic so the gas check works identically to a bet tx) * FinishedOffchainMechDepositSettledRound -> MechRequestRound (deposit landed: re-enter so the executor's ``_retry_pending`` re-POSTs the cached request_id) * FailedOffchainMechRequestRound -> HandleFailedTxRound (all retries exhausted: enter the existing mech-timeout recovery) Multiplexer (tx_settlement_multiplexer_abci/rounds.py): * New event Event.OFFCHAIN_MECH_DEPOSIT_SETTLED. * New degenerate round FinishedOffchainMechDepositSettledRound. * PostTxSettlementRound.end_block dispatches OFFCHAIN_DEPOSIT_TX_SUBMITTER to the new event. * UNRECOGNIZED branch now logs the offending submitter at WARNING so a silently-dropped off-chain deposit is visible in agent logs instead of only in raw Tendermint state. handle_failed_tx.py: * Treats tx_submitter == OFFCHAIN_DEPOSIT_TX_SUBMITTER as a mech timeout alongside the on-chain MechRequestRound id, so the tool-quarantine / shared_state.mech_timed_out / after_bet_attempt bookkeeping fires identically for both paths. Config parity (skill.yaml + both service.yaml MECH_MARKETPLACE_CONFIG env-defaults): seven off-chain knobs added with use_offchain: false default so an env override carries the full dict shape. Bumps mech-interact to v0.32.4-rc1 (skill hash bafybeihhwzpa6x5ypth426tzd2zjsnys6jmjaab4zvk4edisetzktft754) and pulls in the three new third_party contracts (mech_marketplace, balance_tracker_fixed_price_native/_token). Tests: * test_composition.py — each new edge pinned individually (parametrised OFFCHAIN_TRANSITIONS); flat value-set assertions would let a silent target swap pass. * test_rounds.py — pins OFFCHAIN_DEPOSIT_TX_SUBMITTER dispatch and UNRECOGNIZED WARNING log; tripwires updated for new final state and transition entries. * handle_failed_tx covered by existing decision_maker_abci tests. Lock cascade + FSM specs + abci docstrings regenerated. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/valory/agents/trader/aea-config.yaml | 10 +- .../README.md | 1 + .../__init__.py | 20 + .../balance_tracker_fixed_price_native.json | 512 +++++++ .../contract.py | 89 ++ .../contract.yaml | 21 + .../README.md | 1 + .../__init__.py | 20 + .../balance_tracker_fixed_price_token.json | 511 +++++++ .../contract.py | 118 ++ .../contract.yaml | 20 + .../contracts/mech_marketplace/README.md | 1 + .../contracts/mech_marketplace/__init__.py | 20 + .../build/mech_marketplace.json | 1290 +++++++++++++++++ .../contracts/mech_marketplace/contract.py | 131 ++ .../contracts/mech_marketplace/contract.yaml | 21 + .../skills/check_stop_trading_abci/skill.yaml | 2 +- .../behaviours/handle_failed_tx.py | 16 +- .../skills/decision_maker_abci/skill.yaml | 4 +- .../valory/skills/trader_abci/composition.py | 14 + .../skills/trader_abci/fsm_specification.yaml | 11 +- packages/valory/skills/trader_abci/skill.yaml | 22 +- .../trader_abci/tests/test_composition.py | 42 +- .../fsm_specification.yaml | 4 + .../tx_settlement_multiplexer_abci/rounds.py | 43 +- .../tx_settlement_multiplexer_abci/skill.yaml | 10 +- .../tests/test_rounds.py | 46 +- pyproject.toml | 2 +- 28 files changed, 2971 insertions(+), 31 deletions(-) create mode 100644 packages/valory/contracts/balance_tracker_fixed_price_native/README.md create mode 100644 packages/valory/contracts/balance_tracker_fixed_price_native/__init__.py create mode 100644 packages/valory/contracts/balance_tracker_fixed_price_native/build/balance_tracker_fixed_price_native.json create mode 100644 packages/valory/contracts/balance_tracker_fixed_price_native/contract.py create mode 100644 packages/valory/contracts/balance_tracker_fixed_price_native/contract.yaml create mode 100644 packages/valory/contracts/balance_tracker_fixed_price_token/README.md create mode 100644 packages/valory/contracts/balance_tracker_fixed_price_token/__init__.py create mode 100644 packages/valory/contracts/balance_tracker_fixed_price_token/build/balance_tracker_fixed_price_token.json create mode 100644 packages/valory/contracts/balance_tracker_fixed_price_token/contract.py create mode 100644 packages/valory/contracts/balance_tracker_fixed_price_token/contract.yaml create mode 100644 packages/valory/contracts/mech_marketplace/README.md create mode 100644 packages/valory/contracts/mech_marketplace/__init__.py create mode 100644 packages/valory/contracts/mech_marketplace/build/mech_marketplace.json create mode 100644 packages/valory/contracts/mech_marketplace/contract.py create mode 100644 packages/valory/contracts/mech_marketplace/contract.yaml diff --git a/packages/valory/agents/trader/aea-config.yaml b/packages/valory/agents/trader/aea-config.yaml index 02eb574cbe..b85ed5d94c 100644 --- a/packages/valory/agents/trader/aea-config.yaml +++ b/packages/valory/agents/trader/aea-config.yaml @@ -66,13 +66,13 @@ skills: - valory/reset_pause_abci:0.1.0:bafybeihc4ruh25s7wuunfy2b3k2n4eypyhvtry3usgom44wsymagbcr3ki - valory/termination_abci:0.1.0:bafybeibnnzry5kknci3z46gcjgutv4jid3ir6xn6a5adq3tx6v2e25augq - valory/transaction_settlement_abci:0.1.0:bafybeibv3tycpdhphlblu62zpcbjsj7hnwkutexxqagorkelhjlt4t4fii -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeiglvalfzo744cvxvslx4vo42r4tcozn7hzsn3aa2q3hkm77t77xwe +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeiboec4uzlj2yd5oxyg2feh6j26uez55g2d6fxs3xizltchdsqhk5i - valory/market_manager_abci:0.1.0:bafybeic67hypwetzltnuy3a6y3o2o332lxyvn34buq57gy4n6bfqpbpxjm -- valory/decision_maker_abci:0.1.0:bafybeigterfcylnzjzxpja6u56gvcq2grcgvia2qcj34yr2ksogss33wuu -- valory/trader_abci:0.1.0:bafybeifepfhwcrbinv22hlltrf2cfacqybzsdnm63knw73yc5yfoer3ks4 +- valory/decision_maker_abci:0.1.0:bafybeiewwbtf3w5zzs2u22vudkjz5u2xnmvgx7hygo3bmjgn6q32ae6vne +- valory/trader_abci:0.1.0:bafybeibfad73kv2ena463bzyg4xxpksebikoz23bcbwvcqb2bwgmyrd6bu - valory/staking_abci:0.1.0:bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq -- valory/check_stop_trading_abci:0.1.0:bafybeifbiko6p3sqqg2q6qemmcig432s5djcsxm44j35ejittlpyr5f6z4 -- valory/mech_interact_abci:0.1.0:bafybeidnmszufszq3ro4ebgrqzmhqgctrsc6sykeanfsbvotghvt2cgfsy +- valory/check_stop_trading_abci:0.1.0:bafybeiexmdtj3qfjnhh2sy3fa4hwxkvqogsy7u46liobzhgilzogeoezeu +- valory/mech_interact_abci:0.1.0:bafybeihhwzpa6x5ypth426tzd2zjsnys6jmjaab4zvk4edisetzktft754 - valory/chatui_abci:0.1.0:bafybeie2kmgihgk3rwpzelaa76ypvchsyg2vy3me4vxlbjttaq4frs3ipa - valory/agent_performance_summary_abci:0.1.0:bafybeigmmvpncem6i6t57nwjqzajrbnf6rnqgp43mlo6jf6uziq6lrhlca - valory/funds_manager:0.1.0:bafybeibne4vkmbper3ryn7q6kt7lclbyylgorziscyn6msr5qt46aihv4m diff --git a/packages/valory/contracts/balance_tracker_fixed_price_native/README.md b/packages/valory/contracts/balance_tracker_fixed_price_native/README.md new file mode 100644 index 0000000000..421b966966 --- /dev/null +++ b/packages/valory/contracts/balance_tracker_fixed_price_native/README.md @@ -0,0 +1 @@ +# BalanceTrackerFixedPriceNative contract diff --git a/packages/valory/contracts/balance_tracker_fixed_price_native/__init__.py b/packages/valory/contracts/balance_tracker_fixed_price_native/__init__.py new file mode 100644 index 0000000000..0035d32132 --- /dev/null +++ b/packages/valory/contracts/balance_tracker_fixed_price_native/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2026 Valory AG +# +# 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. +# +# ------------------------------------------------------------------------------ + +"""This module contains the BalanceTrackerFixedPriceNative contract.""" diff --git a/packages/valory/contracts/balance_tracker_fixed_price_native/build/balance_tracker_fixed_price_native.json b/packages/valory/contracts/balance_tracker_fixed_price_native/build/balance_tracker_fixed_price_native.json new file mode 100644 index 0000000000..9bc230cce2 --- /dev/null +++ b/packages/valory/contracts/balance_tracker_fixed_price_native/build/balance_tracker_fixed_price_native.json @@ -0,0 +1,512 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BalanceTrackerFixedPriceNative", + "sourceName": "contracts/mechs/native/BalanceTrackerFixedPriceNative.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_mechMarketplace", + "type": "address" + }, + { + "internalType": "address", + "name": "_drainer", + "type": "address" + }, + { + "internalType": "address", + "name": "_wrappedNativeToken", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "current", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "required", + "type": "uint256" + } + ], + "name": "InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "marketplace", + "type": "address" + } + ], + "name": "MarketplaceOnly", + "type": "error" + }, + { + "inputs": [], + "name": "ReentrancyGuard", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "TransferFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "UnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroValue", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "collectedFees", + "type": "uint256" + } + ], + "name": "Drained", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "mech", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "deliveryRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rateDiff", + "type": "uint256" + } + ], + "name": "MechBalanceAdjusted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "deliveryRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "balance", + "type": "uint256" + } + ], + "name": "RequesterBalanceAdjusted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_FEE_FACTOR", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_MECH_BALANCE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "mech", + "type": "address" + }, + { + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "mechDeliveryRates", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "paymentData", + "type": "bytes" + } + ], + "name": "adjustMechRequesterBalances", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "internalType": "uint256", + "name": "numRequests", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deliveryRate", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymentData", + "type": "bytes" + } + ], + "name": "checkAndRecordDeliveryRates", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "collectedFees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "depositFor", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "drain", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "drainer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "mech", + "type": "address" + }, + { + "internalType": "address[]", + "name": "requesters", + "type": "address[]" + }, + { + "internalType": "bool[]", + "name": "deliveredRequests", + "type": "bool[]" + }, + { + "internalType": "uint256[]", + "name": "mechDeliveryRates", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "requesterDeliveryRates", + "type": "uint256[]" + } + ], + "name": "finalizeDeliveryRates", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapMechBalances", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapRequesterBalances", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mechMarketplace", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "processPayment", + "outputs": [ + { + "internalType": "uint256", + "name": "mechPayment", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "marketplaceFee", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "mech", + "type": "address" + } + ], + "name": "processPaymentByMultisig", + "outputs": [ + { + "internalType": "uint256", + "name": "mechPayment", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "marketplaceFee", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "wrappedNativeToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x60e060405260018055348015610013575f5ffd5b50604051611983380380611983833981016040819052610032916100d0565b82826001600160a01b038216158061005157506001600160a01b038116155b1561006f5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03918216608052811660a05281166100a15760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660c052506101109050565b80516001600160a01b03811681146100cb575f5ffd5b919050565b5f5f5f606084860312156100e2575f5ffd5b6100eb846100b5565b92506100f9602085016100b5565b9150610107604085016100b5565b90509250925092565b60805160a05160c0516117fc6101875f395f8181610184015281816110f501528181611162015261137b01525f818161021a01526110c601525f81816102de015281816104240152818161048c015281816106170152818161067f0152818161090c0152818161097401526111d601526117fc5ff3fe6080604052600436106100e7575f3560e01c806379e4afe811610087578063aa67c91911610057578063aa67c91914610300578063af4937fc14610313578063e679803514610328578063f965a87314610353575f5ffd5b806379e4afe8146102865780639003adfe146102a55780639890220b146102b95780639c5e9590146102cd575f5ffd5b806338603a39116100c257806338603a39146101f457806357838e85146102095780636072dd2c1461023c5780636aeeffa81461025b575f5ffd5b8063163ad7151461014c57806317fcb39b1461017357806322081c12146101cb575f5ffd5b3661014857335f908152600260205260408120805434929061010a908490611426565b90915550506040513481525f9033907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060200160405180910390a3005b5f5ffd5b348015610157575f5ffd5b50610160600281565b6040519081526020015b60405180910390f35b34801561017e575f5ffd5b506101a67f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161016a565b3480156101d6575f5ffd5b506101df610372565b6040805192835260208301919091520161016a565b6102076102023660046114a6565b6103cb565b005b348015610214575f5ffd5b506101a67f000000000000000000000000000000000000000000000000000000000000000081565b348015610247575f5ffd5b5061020761025636600461154a565b6105be565b348015610266575f5ffd5b506101606102753660046115da565b60026020525f908152604090205481565b348015610291575f5ffd5b506102076102a03660046115f3565b6108b3565b3480156102b0575f5ffd5b506101605f5481565b3480156102c4575f5ffd5b50610207610c36565b3480156102d8575f5ffd5b506101a67f000000000000000000000000000000000000000000000000000000000000000081565b61020761030e3660046115da565b610cc7565b34801561031e575f5ffd5b5061016061271081565b348015610333575f5ffd5b506101606103423660046115da565b60036020525f908152604090205481565b34801561035e575f5ffd5b506101df61036d3660046115da565b610d50565b5f5f6001546002036103b0576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001556103be33610e6e565b6001805590939092509050565b600154600203610407576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001553373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146104be576040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b5f6104c7610fad565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260026020526040812054919250906104fb908390611426565b90505f61050887876116d3565b905061054b88838388888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610ff192505050565b73ffffffffffffffffffffffffffffffffffffffff89165f81815260026020908152604091829020849055815185815290810184905292945090917e572a5ba2b0e6be13dc09fac07a0c06782c5defdef8694b0085972ebdb12012910160405180910390a2505060018055505050505050565b6001546002036105fa576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001553373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106ac576040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016104b5565b5f805b848110156106e5578585828181106106c9576106c96116ea565b90506020020135826106db9190611426565b91506001016106af565b50805f0361071f576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60025f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490506107a187828487878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610ff192505050565b73ffffffffffffffffffffffffffffffffffffffff8089165f908152600260209081526040808320859055928c1682526003905220549091506107e48382611426565b73ffffffffffffffffffffffffffffffffffffffff8a81165f908152600360209081526040918290208490558151878152908101869052929350908a16917e572a5ba2b0e6be13dc09fac07a0c06782c5defdef8694b0085972ebdb12012910160405180910390a260408051848152602081018390525f81830152905173ffffffffffffffffffffffffffffffffffffffff8b16917fd11af879a940c7604caa3933cb8a021f09a06692f4d05a5843fe06a003abed68919081900360600190a250506001805550505050505050565b6001546002036108ef576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001553373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146109a1576040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016104b5565b5f80805b87811015610b4e578888828181106109bf576109bf6116ea565b90506020020160208101906109d49190611727565b15610b46578686828181106109eb576109eb6116ea565b90506020020135836109fd9190611426565b9250868682818110610a1157610a116116ea565b90506020020135858583818110610a2a57610a2a6116ea565b905060200201351115610b46575f878783818110610a4a57610a4a6116ea565b90506020020135868684818110610a6357610a636116ea565b90506020020135610a749190611749565b9050610a808184611426565b92505f60025f8e8e86818110610a9857610a986116ea565b9050602002016020810190610aad91906115da565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050610af3818361106c565b60025f8f8f87818110610b0857610b086116ea565b9050602002016020810190610b1d91906115da565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f205550505b6001016109a5565b50815f03610b88576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8b165f90815260036020526040902054610bb78382611426565b73ffffffffffffffffffffffffffffffffffffffff8d165f818152600360209081526040918290208490558151878152908101849052908101859052919250907fd11af879a940c7604caa3933cb8a021f09a06692f4d05a5843fe06a003abed689060600160405180910390a250506001805550505050505050505050565b600154600203610c72576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001555f805490819003610cb4576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8055610cc081611080565b5060018055565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526002602052604081208054349290610cfb908490611426565b90915550506040513481525f9073ffffffffffffffffffffffffffffffffffffffff8316907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060200160405180910390a350565b5f5f600154600203610d8e576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001556040517f6d70f7ae00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff841690636d70f7ae90602401602060405180830381865afa158015610dfb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e1f919061175c565b610e57576040517f32b2baa30000000000000000000000000000000000000000000000000000000081523360048201526024016104b5565b610e6083610e6e565b600180559094909350915050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526003602052604081205481906002811015610ed0576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610ed96111d3565b9050612710610ee9600182611749565b610ef383856116d3565b610efd9190611426565b610f079190611777565b9250610f138383611749565b93505f81118015610f22575082155b80610f2b575083155b15610f62576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f5f828254610f729190611426565b909155505073ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812055610fa68585611266565b5050915091565b5f3415610fec576040513481525f9033907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060200160405180910390a35b503490565b5f82841015611059575f6110058585611749565b90506110115f86611426565b945083851015611057576040517fcf47918100000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016104b5565b505b6110638385611749565b95945050505050565b5f6110778284611426565b90505b92915050565b61108981611379565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af115801561113b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061115f919061175c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167fb2559daa129ad136aac2133ac6a0c75920abbef7d6663a017a94e181b13786c3826040516111c891815260200190565b60405180910390a250565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa15801561123d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061126191906117af565b905090565b5f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f81146112bc576040519150601f19603f3d011682016040523d82523d5f602084013e6112c1565b606091505b5050905080611327576040517fcd3f16590000000000000000000000000000000000000000000000000000000081525f600482015230602482015273ffffffffffffffffffffffffffffffffffffffff84166044820152606481018390526084016104b5565b6040518281525f9073ffffffffffffffffffffffffffffffffffffffff8516907f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9060200160405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b1580156113df575f5ffd5b505af11580156113f1573d5f5f3e3d5ffd5b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561107a5761107a6113f9565b803573ffffffffffffffffffffffffffffffffffffffff8116811461145c575f5ffd5b919050565b5f5f83601f840112611471575f5ffd5b50813567ffffffffffffffff811115611488575f5ffd5b60208301915083602082850101111561149f575f5ffd5b9250929050565b5f5f5f5f5f608086880312156114ba575f5ffd5b6114c386611439565b94506020860135935060408601359250606086013567ffffffffffffffff8111156114ec575f5ffd5b6114f888828901611461565b969995985093965092949392505050565b5f5f83601f840112611519575f5ffd5b50813567ffffffffffffffff811115611530575f5ffd5b6020830191508360208260051b850101111561149f575f5ffd5b5f5f5f5f5f5f6080878903121561155f575f5ffd5b61156887611439565b955061157660208801611439565b9450604087013567ffffffffffffffff811115611591575f5ffd5b61159d89828a01611509565b909550935050606087013567ffffffffffffffff8111156115bc575f5ffd5b6115c889828a01611461565b979a9699509497509295939492505050565b5f602082840312156115ea575f5ffd5b61107782611439565b5f5f5f5f5f5f5f5f5f60a08a8c03121561160b575f5ffd5b6116148a611439565b985060208a013567ffffffffffffffff81111561162f575f5ffd5b61163b8c828d01611509565b90995097505060408a013567ffffffffffffffff81111561165a575f5ffd5b6116668c828d01611509565b90975095505060608a013567ffffffffffffffff811115611685575f5ffd5b6116918c828d01611509565b90955093505060808a013567ffffffffffffffff8111156116b0575f5ffd5b6116bc8c828d01611509565b915080935050809150509295985092959850929598565b808202811582820484141761107a5761107a6113f9565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8015158114611724575f5ffd5b50565b5f60208284031215611737575f5ffd5b813561174281611717565b9392505050565b8181038181111561107a5761107a6113f9565b5f6020828403121561176c575f5ffd5b815161174281611717565b5f826117aa577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f602082840312156117bf575f5ffd5b505191905056fea26469706673582212204d50d2673896150157990f656d6097352568fffa53f07c76b043de309e7bd34d64736f6c634300081c0033", + "deployedBytecode": "0x6080604052600436106100e7575f3560e01c806379e4afe811610087578063aa67c91911610057578063aa67c91914610300578063af4937fc14610313578063e679803514610328578063f965a87314610353575f5ffd5b806379e4afe8146102865780639003adfe146102a55780639890220b146102b95780639c5e9590146102cd575f5ffd5b806338603a39116100c257806338603a39146101f457806357838e85146102095780636072dd2c1461023c5780636aeeffa81461025b575f5ffd5b8063163ad7151461014c57806317fcb39b1461017357806322081c12146101cb575f5ffd5b3661014857335f908152600260205260408120805434929061010a908490611426565b90915550506040513481525f9033907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060200160405180910390a3005b5f5ffd5b348015610157575f5ffd5b50610160600281565b6040519081526020015b60405180910390f35b34801561017e575f5ffd5b506101a67f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161016a565b3480156101d6575f5ffd5b506101df610372565b6040805192835260208301919091520161016a565b6102076102023660046114a6565b6103cb565b005b348015610214575f5ffd5b506101a67f000000000000000000000000000000000000000000000000000000000000000081565b348015610247575f5ffd5b5061020761025636600461154a565b6105be565b348015610266575f5ffd5b506101606102753660046115da565b60026020525f908152604090205481565b348015610291575f5ffd5b506102076102a03660046115f3565b6108b3565b3480156102b0575f5ffd5b506101605f5481565b3480156102c4575f5ffd5b50610207610c36565b3480156102d8575f5ffd5b506101a67f000000000000000000000000000000000000000000000000000000000000000081565b61020761030e3660046115da565b610cc7565b34801561031e575f5ffd5b5061016061271081565b348015610333575f5ffd5b506101606103423660046115da565b60036020525f908152604090205481565b34801561035e575f5ffd5b506101df61036d3660046115da565b610d50565b5f5f6001546002036103b0576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001556103be33610e6e565b6001805590939092509050565b600154600203610407576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001553373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146104be576040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b5f6104c7610fad565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260026020526040812054919250906104fb908390611426565b90505f61050887876116d3565b905061054b88838388888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610ff192505050565b73ffffffffffffffffffffffffffffffffffffffff89165f81815260026020908152604091829020849055815185815290810184905292945090917e572a5ba2b0e6be13dc09fac07a0c06782c5defdef8694b0085972ebdb12012910160405180910390a2505060018055505050505050565b6001546002036105fa576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001553373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106ac576040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016104b5565b5f805b848110156106e5578585828181106106c9576106c96116ea565b90506020020135826106db9190611426565b91506001016106af565b50805f0361071f576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60025f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490506107a187828487878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610ff192505050565b73ffffffffffffffffffffffffffffffffffffffff8089165f908152600260209081526040808320859055928c1682526003905220549091506107e48382611426565b73ffffffffffffffffffffffffffffffffffffffff8a81165f908152600360209081526040918290208490558151878152908101869052929350908a16917e572a5ba2b0e6be13dc09fac07a0c06782c5defdef8694b0085972ebdb12012910160405180910390a260408051848152602081018390525f81830152905173ffffffffffffffffffffffffffffffffffffffff8b16917fd11af879a940c7604caa3933cb8a021f09a06692f4d05a5843fe06a003abed68919081900360600190a250506001805550505050505050565b6001546002036108ef576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001553373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146109a1576040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016104b5565b5f80805b87811015610b4e578888828181106109bf576109bf6116ea565b90506020020160208101906109d49190611727565b15610b46578686828181106109eb576109eb6116ea565b90506020020135836109fd9190611426565b9250868682818110610a1157610a116116ea565b90506020020135858583818110610a2a57610a2a6116ea565b905060200201351115610b46575f878783818110610a4a57610a4a6116ea565b90506020020135868684818110610a6357610a636116ea565b90506020020135610a749190611749565b9050610a808184611426565b92505f60025f8e8e86818110610a9857610a986116ea565b9050602002016020810190610aad91906115da565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050610af3818361106c565b60025f8f8f87818110610b0857610b086116ea565b9050602002016020810190610b1d91906115da565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f205550505b6001016109a5565b50815f03610b88576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8b165f90815260036020526040902054610bb78382611426565b73ffffffffffffffffffffffffffffffffffffffff8d165f818152600360209081526040918290208490558151878152908101849052908101859052919250907fd11af879a940c7604caa3933cb8a021f09a06692f4d05a5843fe06a003abed689060600160405180910390a250506001805550505050505050505050565b600154600203610c72576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001555f805490819003610cb4576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8055610cc081611080565b5060018055565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526002602052604081208054349290610cfb908490611426565b90915550506040513481525f9073ffffffffffffffffffffffffffffffffffffffff8316907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060200160405180910390a350565b5f5f600154600203610d8e576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001556040517f6d70f7ae00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff841690636d70f7ae90602401602060405180830381865afa158015610dfb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e1f919061175c565b610e57576040517f32b2baa30000000000000000000000000000000000000000000000000000000081523360048201526024016104b5565b610e6083610e6e565b600180559094909350915050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526003602052604081205481906002811015610ed0576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610ed96111d3565b9050612710610ee9600182611749565b610ef383856116d3565b610efd9190611426565b610f079190611777565b9250610f138383611749565b93505f81118015610f22575082155b80610f2b575083155b15610f62576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f5f828254610f729190611426565b909155505073ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812055610fa68585611266565b5050915091565b5f3415610fec576040513481525f9033907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060200160405180910390a35b503490565b5f82841015611059575f6110058585611749565b90506110115f86611426565b945083851015611057576040517fcf47918100000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016104b5565b505b6110638385611749565b95945050505050565b5f6110778284611426565b90505b92915050565b61108981611379565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af115801561113b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061115f919061175c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167fb2559daa129ad136aac2133ac6a0c75920abbef7d6663a017a94e181b13786c3826040516111c891815260200190565b60405180910390a250565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa15801561123d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061126191906117af565b905090565b5f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f81146112bc576040519150601f19603f3d011682016040523d82523d5f602084013e6112c1565b606091505b5050905080611327576040517fcd3f16590000000000000000000000000000000000000000000000000000000081525f600482015230602482015273ffffffffffffffffffffffffffffffffffffffff84166044820152606481018390526084016104b5565b6040518281525f9073ffffffffffffffffffffffffffffffffffffffff8516907f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9060200160405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b1580156113df575f5ffd5b505af11580156113f1573d5f5f3e3d5ffd5b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561107a5761107a6113f9565b803573ffffffffffffffffffffffffffffffffffffffff8116811461145c575f5ffd5b919050565b5f5f83601f840112611471575f5ffd5b50813567ffffffffffffffff811115611488575f5ffd5b60208301915083602082850101111561149f575f5ffd5b9250929050565b5f5f5f5f5f608086880312156114ba575f5ffd5b6114c386611439565b94506020860135935060408601359250606086013567ffffffffffffffff8111156114ec575f5ffd5b6114f888828901611461565b969995985093965092949392505050565b5f5f83601f840112611519575f5ffd5b50813567ffffffffffffffff811115611530575f5ffd5b6020830191508360208260051b850101111561149f575f5ffd5b5f5f5f5f5f5f6080878903121561155f575f5ffd5b61156887611439565b955061157660208801611439565b9450604087013567ffffffffffffffff811115611591575f5ffd5b61159d89828a01611509565b909550935050606087013567ffffffffffffffff8111156115bc575f5ffd5b6115c889828a01611461565b979a9699509497509295939492505050565b5f602082840312156115ea575f5ffd5b61107782611439565b5f5f5f5f5f5f5f5f5f60a08a8c03121561160b575f5ffd5b6116148a611439565b985060208a013567ffffffffffffffff81111561162f575f5ffd5b61163b8c828d01611509565b90995097505060408a013567ffffffffffffffff81111561165a575f5ffd5b6116668c828d01611509565b90975095505060608a013567ffffffffffffffff811115611685575f5ffd5b6116918c828d01611509565b90955093505060808a013567ffffffffffffffff8111156116b0575f5ffd5b6116bc8c828d01611509565b915080935050809150509295985092959850929598565b808202811582820484141761107a5761107a6113f9565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8015158114611724575f5ffd5b50565b5f60208284031215611737575f5ffd5b813561174281611717565b9392505050565b8181038181111561107a5761107a6113f9565b5f6020828403121561176c575f5ffd5b815161174281611717565b5f826117aa577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f602082840312156117bf575f5ffd5b505191905056fea26469706673582212204d50d2673896150157990f656d6097352568fffa53f07c76b043de309e7bd34d64736f6c634300081c0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/valory/contracts/balance_tracker_fixed_price_native/contract.py b/packages/valory/contracts/balance_tracker_fixed_price_native/contract.py new file mode 100644 index 0000000000..0688b714fa --- /dev/null +++ b/packages/valory/contracts/balance_tracker_fixed_price_native/contract.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2026 Valory AG +# +# 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. +# +# ------------------------------------------------------------------------------ + +"""Wrapper for the BalanceTrackerFixedPriceNative marketplace contract.""" + +from typing import Dict + +from aea.common import JSONLike +from aea.configurations.base import PublicId +from aea.contracts.base import Contract +from aea.crypto.base import LedgerApi +from aea_ledger_ethereum import EthereumApi + +PUBLIC_ID = PublicId.from_str("valory/balance_tracker_fixed_price_native:0.1.0") + + +class BalanceTrackerFixedPriceNative(Contract): + """Balance tracker for the fixed-price native (xDAI / ETH) payment model. + + The native variant of the BalanceTracker contracts. Funds arrive via + ``msg.value``; the ``depositFor`` function is ``payable`` and takes only + the credited account as a parameter. The Safe-multisend caller supplies + the amount through the ``value`` field of the transaction, not through + the calldata. + """ + + contract_id = PUBLIC_ID + + @classmethod + def get_balance( + cls, + ledger_api: EthereumApi, + contract_address: str, + account: str, + ) -> JSONLike: + """Read the prepaid balance for ``account`` on this BalanceTracker. + + Mirrors the contract's ``mapRequesterBalances(account)`` getter. + Returned value is in wei. + + :param ledger_api: the ledger API object. + :param contract_address: the BalanceTracker contract address. + :param account: the requester address whose balance to read. + :return: ``{"balance": int}`` matching the ``GET_STATE`` shape. + """ + contract_address = ledger_api.api.to_checksum_address(contract_address) + account = ledger_api.api.to_checksum_address(account) + contract_instance = cls.get_instance(ledger_api, contract_address) + balance = contract_instance.functions.mapRequesterBalances(account).call() + return dict(balance=balance) + + @classmethod + def build_deposit_for_data( + cls, + ledger_api: LedgerApi, + contract_address: str, + account: str, + ) -> Dict[str, bytes]: + """Encode the calldata for ``depositFor(account)``. + + Returned as raw bytes ready to be paired with a non-zero ``value`` + in the Safe-multisend batch. The deposit amount is carried by + ``msg.value`` on chain rather than by the calldata. + + :param ledger_api: the ledger API object. + :param contract_address: the BalanceTracker contract address. + :param account: the requester address being credited. + :return: ``{"data": bytes}`` calldata for the multisend batch. + """ + contract_instance = cls.get_instance(ledger_api, contract_address) + account = ledger_api.api.to_checksum_address(account) + data = contract_instance.encode_abi("depositFor", args=(account,)) + return {"data": bytes.fromhex(data[2:])} diff --git a/packages/valory/contracts/balance_tracker_fixed_price_native/contract.yaml b/packages/valory/contracts/balance_tracker_fixed_price_native/contract.yaml new file mode 100644 index 0000000000..e627f4c616 --- /dev/null +++ b/packages/valory/contracts/balance_tracker_fixed_price_native/contract.yaml @@ -0,0 +1,21 @@ +name: balance_tracker_fixed_price_native +author: valory +version: 0.1.0 +type: contract +description: Balance tracker contract for the fixed-price native (xDAI / ETH) payment + model. +license: Apache-2.0 +aea_version: '>=2.0.0, <3.0.0' +fingerprint: + README.md: bafybeiaciz6fqemsxoo6vp55kvche6o2sciovo6mx4bwmobmphv5fxj2xa + __init__.py: bafybeic26yci54hmmqca43ro7hwxfy5cjwwipt7iheq63cvmko3unldyne + build/balance_tracker_fixed_price_native.json: bafybeiapfus4ith6atrc2bgznpltf5zzpjitiwdivlxesw2epjqqdbherm + contract.py: bafybeibnr74vswbe4au7kmxeadrt3z2oxxigx4blv7ariyi2oojpjxc7w4 +fingerprint_ignore_patterns: [] +contracts: [] +class_name: BalanceTrackerFixedPriceNative +contract_interface_paths: + ethereum: build/balance_tracker_fixed_price_native.json +dependencies: + open-aea-ledger-ethereum: + version: ==2.2.7 diff --git a/packages/valory/contracts/balance_tracker_fixed_price_token/README.md b/packages/valory/contracts/balance_tracker_fixed_price_token/README.md new file mode 100644 index 0000000000..4840ec61bb --- /dev/null +++ b/packages/valory/contracts/balance_tracker_fixed_price_token/README.md @@ -0,0 +1 @@ +# BalanceTrackerFixedPriceToken contract diff --git a/packages/valory/contracts/balance_tracker_fixed_price_token/__init__.py b/packages/valory/contracts/balance_tracker_fixed_price_token/__init__.py new file mode 100644 index 0000000000..2f3d9acc3c --- /dev/null +++ b/packages/valory/contracts/balance_tracker_fixed_price_token/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2026 Valory AG +# +# 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. +# +# ------------------------------------------------------------------------------ + +"""This module contains the BalanceTrackerFixedPriceToken contract.""" diff --git a/packages/valory/contracts/balance_tracker_fixed_price_token/build/balance_tracker_fixed_price_token.json b/packages/valory/contracts/balance_tracker_fixed_price_token/build/balance_tracker_fixed_price_token.json new file mode 100644 index 0000000000..20d74c212b --- /dev/null +++ b/packages/valory/contracts/balance_tracker_fixed_price_token/build/balance_tracker_fixed_price_token.json @@ -0,0 +1,511 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BalanceTrackerFixedPriceToken", + "sourceName": "contracts/mechs/token/BalanceTrackerFixedPriceToken.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_mechMarketplace", + "type": "address" + }, + { + "internalType": "address", + "name": "_drainer", + "type": "address" + }, + { + "internalType": "address", + "name": "_token", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "current", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "required", + "type": "uint256" + } + ], + "name": "InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "marketplace", + "type": "address" + } + ], + "name": "MarketplaceOnly", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "NoDepositAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ReentrancyGuard", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "UnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroValue", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "collectedFees", + "type": "uint256" + } + ], + "name": "Drained", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "mech", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "deliveryRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rateDiff", + "type": "uint256" + } + ], + "name": "MechBalanceAdjusted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "deliveryRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "balance", + "type": "uint256" + } + ], + "name": "RequesterBalanceAdjusted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_FEE_FACTOR", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_MECH_BALANCE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "mech", + "type": "address" + }, + { + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "mechDeliveryRates", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "paymentData", + "type": "bytes" + } + ], + "name": "adjustMechRequesterBalances", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "internalType": "uint256", + "name": "numRequests", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deliveryRate", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymentData", + "type": "bytes" + } + ], + "name": "checkAndRecordDeliveryRates", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "collectedFees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "depositFor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "drain", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "drainer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "mech", + "type": "address" + }, + { + "internalType": "address[]", + "name": "requesters", + "type": "address[]" + }, + { + "internalType": "bool[]", + "name": "deliveredRequests", + "type": "bool[]" + }, + { + "internalType": "uint256[]", + "name": "mechDeliveryRates", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "requesterDeliveryRates", + "type": "uint256[]" + } + ], + "name": "finalizeDeliveryRates", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapMechBalances", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapRequesterBalances", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mechMarketplace", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "processPayment", + "outputs": [ + { + "internalType": "uint256", + "name": "mechPayment", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "marketplaceFee", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "mech", + "type": "address" + } + ], + "name": "processPaymentByMultisig", + "outputs": [ + { + "internalType": "uint256", + "name": "mechPayment", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "marketplaceFee", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "token", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60e060405260018055348015610013575f5ffd5b50604051611cdd380380611cdd833981016040819052610032916100d0565b82826001600160a01b038216158061005157506001600160a01b038116155b1561006f5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03918216608052811660a05281166100a15760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660c052506101109050565b80516001600160a01b03811681146100cb575f5ffd5b919050565b5f5f5f606084860312156100e2575f5ffd5b6100eb846100b5565b92506100f9602085016100b5565b9150610107604085016100b5565b90509250925092565b60805160a05160c051611b256101b85f395f8181610322015281816104110152818161049301528181610e7601528181610f130152818161130801528181611375015281816114c50152818161153201528181611603015261168d01525f818161018801526112d901525f818161027101528181610575015281816105dd01528181610768015281816107d001528181610a5d01528181610ac501526113e90152611b255ff3fe6080604052600436106100ef575f3560e01c80639003adfe11610087578063b6b55f2511610057578063b6b55f25146102a8578063e6798035146102c7578063f965a873146102f2578063fc0c546a14610311575f5ffd5b80639003adfe146102385780639890220b1461024c5780639c5e959014610260578063af4937fc14610293575f5ffd5b806357838e85116100c257806357838e85146101775780636072dd2c146101cf5780636aeeffa8146101ee57806379e4afe814610219575f5ffd5b8063163ad715146100f357806322081c121461011a5780632f4f21e21461014357806338603a3914610164575b5f5ffd5b3480156100fe575f5ffd5b50610107600281565b6040519081526020015b60405180910390f35b348015610125575f5ffd5b5061012e610344565b60408051928352602083019190915201610111565b34801561014e575f5ffd5b5061016261015d36600461170b565b61039d565b005b610162610172366004611778565b61051c565b348015610182575f5ffd5b506101aa7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610111565b3480156101da575f5ffd5b506101626101e936600461181c565b61070f565b3480156101f9575f5ffd5b506101076102083660046118ac565b60026020525f908152604090205481565b348015610224575f5ffd5b506101626102333660046118c5565b610a04565b348015610243575f5ffd5b506101075f5481565b348015610257575f5ffd5b50610162610d87565b34801561026b575f5ffd5b506101aa7f000000000000000000000000000000000000000000000000000000000000000081565b34801561029e575f5ffd5b5061010761271081565b3480156102b3575f5ffd5b506101626102c23660046119a5565b610e18565b3480156102d2575f5ffd5b506101076102e13660046118ac565b60036020525f908152604090205481565b3480156102fd575f5ffd5b5061012e61030c3660046118ac565b610f66565b34801561031c575f5ffd5b506101aa7f000000000000000000000000000000000000000000000000000000000000000081565b5f5f600154600203610382576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260015561039033611084565b6001805590939092509050565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260026020526040812080548392906103d19084906119e9565b90915550506040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af115801561046c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104909190611a0c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f628360405161051091815260200190565b60405180910390a35050565b600154600203610558576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001553373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461060f576040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b5f6106186111c3565b73ffffffffffffffffffffffffffffffffffffffff87165f908152600260205260408120549192509061064c9083906119e9565b90505f6106598787611a2e565b905061069c88838388888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061120392505050565b73ffffffffffffffffffffffffffffffffffffffff89165f81815260026020908152604091829020849055815185815290810184905292945090917e572a5ba2b0e6be13dc09fac07a0c06782c5defdef8694b0085972ebdb12012910160405180910390a2505060018055505050505050565b60015460020361074b576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001553373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107fd576040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610606565b5f805b848110156108365785858281811061081a5761081a611a45565b905060200201358261082c91906119e9565b9150600101610800565b50805f03610870576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60025f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490506108f287828487878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061120392505050565b73ffffffffffffffffffffffffffffffffffffffff8089165f908152600260209081526040808320859055928c16825260039052205490915061093583826119e9565b73ffffffffffffffffffffffffffffffffffffffff8a81165f908152600360209081526040918290208490558151878152908101869052929350908a16917e572a5ba2b0e6be13dc09fac07a0c06782c5defdef8694b0085972ebdb12012910160405180910390a260408051848152602081018390525f81830152905173ffffffffffffffffffffffffffffffffffffffff8b16917fd11af879a940c7604caa3933cb8a021f09a06692f4d05a5843fe06a003abed68919081900360600190a250506001805550505050505050565b600154600203610a40576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001553373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610af2576040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610606565b5f80805b87811015610c9f57888882818110610b1057610b10611a45565b9050602002016020810190610b259190611a72565b15610c9757868682818110610b3c57610b3c611a45565b9050602002013583610b4e91906119e9565b9250868682818110610b6257610b62611a45565b90506020020135858583818110610b7b57610b7b611a45565b905060200201351115610c97575f878783818110610b9b57610b9b611a45565b90506020020135868684818110610bb457610bb4611a45565b90506020020135610bc59190611a8d565b9050610bd181846119e9565b92505f60025f8e8e86818110610be957610be9611a45565b9050602002016020810190610bfe91906118ac565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050610c448183611288565b60025f8f8f87818110610c5957610c59611a45565b9050602002016020810190610c6e91906118ac565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f205550505b600101610af6565b50815f03610cd9576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8b165f90815260036020526040902054610d0883826119e9565b73ffffffffffffffffffffffffffffffffffffffff8d165f818152600360209081526040918290208490558151878152908101849052908101859052919250907fd11af879a940c7604caa3933cb8a021f09a06692f4d05a5843fe06a003abed689060600160405180910390a250506001805550505050505050505050565b600154600203610dc3576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001555f805490819003610e05576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8055610e118161129c565b5060018055565b335f9081526002602052604081208054839290610e369084906119e9565b90915550506040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af1158015610ed1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ef59190611a0c565b5060405181815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169033907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060200160405180910390a350565b5f5f600154600203610fa4576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001556040517f6d70f7ae00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff841690636d70f7ae90602401602060405180830381865afa158015611011573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110359190611a0c565b61106d576040517f32b2baa3000000000000000000000000000000000000000000000000000000008152336004820152602401610606565b61107683611084565b600180559094909350915050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020526040812054819060028110156110e6576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6110ef6113e6565b90506127106110ff600182611a8d565b6111098385611a2e565b61111391906119e9565b61111d9190611aa0565b92506111298383611a8d565b93505f81118015611138575082155b80611141575083155b15611178576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f5f82825461118891906119e9565b909155505073ffffffffffffffffffffffffffffffffffffffff85165f908152600360205260408120556111bc8585611479565b5050915091565b5f34156111fe576040517f0f0fe74c000000000000000000000000000000000000000000000000000000008152346004820152602401610606565b505f90565b5f82841015611275575f6112178585611a8d565b905061122386826115af565b61122d90866119e9565b945083851015611273576040517fcf4791810000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610606565b505b61127f8385611a8d565b95945050505050565b5f61129382846119e9565b90505b92915050565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af115801561134e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113729190611a0c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167fb2559daa129ad136aac2133ac6a0c75920abbef7d6663a017a94e181b13786c3826040516113db91815260200190565b60405180910390a250565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015611450573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114749190611ad8565b905090565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af115801561150b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152f9190611a0c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb8360405161051091815260200190565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152306024830152604482018390525f917f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af115801561164b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166f9190611a0c565b5060405182815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169033907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060200160405180910390a350919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611706575f5ffd5b919050565b5f5f6040838503121561171c575f5ffd5b611725836116e3565b946020939093013593505050565b5f5f83601f840112611743575f5ffd5b50813567ffffffffffffffff81111561175a575f5ffd5b602083019150836020828501011115611771575f5ffd5b9250929050565b5f5f5f5f5f6080868803121561178c575f5ffd5b611795866116e3565b94506020860135935060408601359250606086013567ffffffffffffffff8111156117be575f5ffd5b6117ca88828901611733565b969995985093965092949392505050565b5f5f83601f8401126117eb575f5ffd5b50813567ffffffffffffffff811115611802575f5ffd5b6020830191508360208260051b8501011115611771575f5ffd5b5f5f5f5f5f5f60808789031215611831575f5ffd5b61183a876116e3565b9550611848602088016116e3565b9450604087013567ffffffffffffffff811115611863575f5ffd5b61186f89828a016117db565b909550935050606087013567ffffffffffffffff81111561188e575f5ffd5b61189a89828a01611733565b979a9699509497509295939492505050565b5f602082840312156118bc575f5ffd5b611293826116e3565b5f5f5f5f5f5f5f5f5f60a08a8c0312156118dd575f5ffd5b6118e68a6116e3565b985060208a013567ffffffffffffffff811115611901575f5ffd5b61190d8c828d016117db565b90995097505060408a013567ffffffffffffffff81111561192c575f5ffd5b6119388c828d016117db565b90975095505060608a013567ffffffffffffffff811115611957575f5ffd5b6119638c828d016117db565b90955093505060808a013567ffffffffffffffff811115611982575f5ffd5b61198e8c828d016117db565b915080935050809150509295985092959850929598565b5f602082840312156119b5575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611296576112966119bc565b8015158114611a09575f5ffd5b50565b5f60208284031215611a1c575f5ffd5b8151611a27816119fc565b9392505050565b8082028115828204841417611296576112966119bc565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215611a82575f5ffd5b8135611a27816119fc565b81810381811115611296576112966119bc565b5f82611ad3577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f60208284031215611ae8575f5ffd5b505191905056fea2646970667358221220b450c3a067ebabe1b92cb7d866a3fb17b28226d4a6b98811fca9d99ef74d959664736f6c634300081c0033", + "deployedBytecode": "0x6080604052600436106100ef575f3560e01c80639003adfe11610087578063b6b55f2511610057578063b6b55f25146102a8578063e6798035146102c7578063f965a873146102f2578063fc0c546a14610311575f5ffd5b80639003adfe146102385780639890220b1461024c5780639c5e959014610260578063af4937fc14610293575f5ffd5b806357838e85116100c257806357838e85146101775780636072dd2c146101cf5780636aeeffa8146101ee57806379e4afe814610219575f5ffd5b8063163ad715146100f357806322081c121461011a5780632f4f21e21461014357806338603a3914610164575b5f5ffd5b3480156100fe575f5ffd5b50610107600281565b6040519081526020015b60405180910390f35b348015610125575f5ffd5b5061012e610344565b60408051928352602083019190915201610111565b34801561014e575f5ffd5b5061016261015d36600461170b565b61039d565b005b610162610172366004611778565b61051c565b348015610182575f5ffd5b506101aa7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610111565b3480156101da575f5ffd5b506101626101e936600461181c565b61070f565b3480156101f9575f5ffd5b506101076102083660046118ac565b60026020525f908152604090205481565b348015610224575f5ffd5b506101626102333660046118c5565b610a04565b348015610243575f5ffd5b506101075f5481565b348015610257575f5ffd5b50610162610d87565b34801561026b575f5ffd5b506101aa7f000000000000000000000000000000000000000000000000000000000000000081565b34801561029e575f5ffd5b5061010761271081565b3480156102b3575f5ffd5b506101626102c23660046119a5565b610e18565b3480156102d2575f5ffd5b506101076102e13660046118ac565b60036020525f908152604090205481565b3480156102fd575f5ffd5b5061012e61030c3660046118ac565b610f66565b34801561031c575f5ffd5b506101aa7f000000000000000000000000000000000000000000000000000000000000000081565b5f5f600154600203610382576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260015561039033611084565b6001805590939092509050565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260026020526040812080548392906103d19084906119e9565b90915550506040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af115801561046c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104909190611a0c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f628360405161051091815260200190565b60405180910390a35050565b600154600203610558576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001553373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461060f576040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b5f6106186111c3565b73ffffffffffffffffffffffffffffffffffffffff87165f908152600260205260408120549192509061064c9083906119e9565b90505f6106598787611a2e565b905061069c88838388888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061120392505050565b73ffffffffffffffffffffffffffffffffffffffff89165f81815260026020908152604091829020849055815185815290810184905292945090917e572a5ba2b0e6be13dc09fac07a0c06782c5defdef8694b0085972ebdb12012910160405180910390a2505060018055505050505050565b60015460020361074b576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001553373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107fd576040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610606565b5f805b848110156108365785858281811061081a5761081a611a45565b905060200201358261082c91906119e9565b9150600101610800565b50805f03610870576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60025f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490506108f287828487878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061120392505050565b73ffffffffffffffffffffffffffffffffffffffff8089165f908152600260209081526040808320859055928c16825260039052205490915061093583826119e9565b73ffffffffffffffffffffffffffffffffffffffff8a81165f908152600360209081526040918290208490558151878152908101869052929350908a16917e572a5ba2b0e6be13dc09fac07a0c06782c5defdef8694b0085972ebdb12012910160405180910390a260408051848152602081018390525f81830152905173ffffffffffffffffffffffffffffffffffffffff8b16917fd11af879a940c7604caa3933cb8a021f09a06692f4d05a5843fe06a003abed68919081900360600190a250506001805550505050505050565b600154600203610a40576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001553373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610af2576040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610606565b5f80805b87811015610c9f57888882818110610b1057610b10611a45565b9050602002016020810190610b259190611a72565b15610c9757868682818110610b3c57610b3c611a45565b9050602002013583610b4e91906119e9565b9250868682818110610b6257610b62611a45565b90506020020135858583818110610b7b57610b7b611a45565b905060200201351115610c97575f878783818110610b9b57610b9b611a45565b90506020020135868684818110610bb457610bb4611a45565b90506020020135610bc59190611a8d565b9050610bd181846119e9565b92505f60025f8e8e86818110610be957610be9611a45565b9050602002016020810190610bfe91906118ac565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050610c448183611288565b60025f8f8f87818110610c5957610c59611a45565b9050602002016020810190610c6e91906118ac565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f205550505b600101610af6565b50815f03610cd9576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8b165f90815260036020526040902054610d0883826119e9565b73ffffffffffffffffffffffffffffffffffffffff8d165f818152600360209081526040918290208490558151878152908101849052908101859052919250907fd11af879a940c7604caa3933cb8a021f09a06692f4d05a5843fe06a003abed689060600160405180910390a250506001805550505050505050505050565b600154600203610dc3576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001555f805490819003610e05576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8055610e118161129c565b5060018055565b335f9081526002602052604081208054839290610e369084906119e9565b90915550506040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af1158015610ed1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ef59190611a0c565b5060405181815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169033907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060200160405180910390a350565b5f5f600154600203610fa4576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001556040517f6d70f7ae00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff841690636d70f7ae90602401602060405180830381865afa158015611011573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110359190611a0c565b61106d576040517f32b2baa3000000000000000000000000000000000000000000000000000000008152336004820152602401610606565b61107683611084565b600180559094909350915050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020526040812054819060028110156110e6576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6110ef6113e6565b90506127106110ff600182611a8d565b6111098385611a2e565b61111391906119e9565b61111d9190611aa0565b92506111298383611a8d565b93505f81118015611138575082155b80611141575083155b15611178576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f5f82825461118891906119e9565b909155505073ffffffffffffffffffffffffffffffffffffffff85165f908152600360205260408120556111bc8585611479565b5050915091565b5f34156111fe576040517f0f0fe74c000000000000000000000000000000000000000000000000000000008152346004820152602401610606565b505f90565b5f82841015611275575f6112178585611a8d565b905061122386826115af565b61122d90866119e9565b945083851015611273576040517fcf4791810000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610606565b505b61127f8385611a8d565b95945050505050565b5f61129382846119e9565b90505b92915050565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af115801561134e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113729190611a0c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167fb2559daa129ad136aac2133ac6a0c75920abbef7d6663a017a94e181b13786c3826040516113db91815260200190565b60405180910390a250565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015611450573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114749190611ad8565b905090565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af115801561150b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152f9190611a0c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb8360405161051091815260200190565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152306024830152604482018390525f917f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af115801561164b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166f9190611a0c565b5060405182815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169033907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060200160405180910390a350919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611706575f5ffd5b919050565b5f5f6040838503121561171c575f5ffd5b611725836116e3565b946020939093013593505050565b5f5f83601f840112611743575f5ffd5b50813567ffffffffffffffff81111561175a575f5ffd5b602083019150836020828501011115611771575f5ffd5b9250929050565b5f5f5f5f5f6080868803121561178c575f5ffd5b611795866116e3565b94506020860135935060408601359250606086013567ffffffffffffffff8111156117be575f5ffd5b6117ca88828901611733565b969995985093965092949392505050565b5f5f83601f8401126117eb575f5ffd5b50813567ffffffffffffffff811115611802575f5ffd5b6020830191508360208260051b8501011115611771575f5ffd5b5f5f5f5f5f5f60808789031215611831575f5ffd5b61183a876116e3565b9550611848602088016116e3565b9450604087013567ffffffffffffffff811115611863575f5ffd5b61186f89828a016117db565b909550935050606087013567ffffffffffffffff81111561188e575f5ffd5b61189a89828a01611733565b979a9699509497509295939492505050565b5f602082840312156118bc575f5ffd5b611293826116e3565b5f5f5f5f5f5f5f5f5f60a08a8c0312156118dd575f5ffd5b6118e68a6116e3565b985060208a013567ffffffffffffffff811115611901575f5ffd5b61190d8c828d016117db565b90995097505060408a013567ffffffffffffffff81111561192c575f5ffd5b6119388c828d016117db565b90975095505060608a013567ffffffffffffffff811115611957575f5ffd5b6119638c828d016117db565b90955093505060808a013567ffffffffffffffff811115611982575f5ffd5b61198e8c828d016117db565b915080935050809150509295985092959850929598565b5f602082840312156119b5575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611296576112966119bc565b8015158114611a09575f5ffd5b50565b5f60208284031215611a1c575f5ffd5b8151611a27816119fc565b9392505050565b8082028115828204841417611296576112966119bc565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215611a82575f5ffd5b8135611a27816119fc565b81810381811115611296576112966119bc565b5f82611ad3577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f60208284031215611ae8575f5ffd5b505191905056fea2646970667358221220b450c3a067ebabe1b92cb7d866a3fb17b28226d4a6b98811fca9d99ef74d959664736f6c634300081c0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/valory/contracts/balance_tracker_fixed_price_token/contract.py b/packages/valory/contracts/balance_tracker_fixed_price_token/contract.py new file mode 100644 index 0000000000..7edb5068cd --- /dev/null +++ b/packages/valory/contracts/balance_tracker_fixed_price_token/contract.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2026 Valory AG +# +# 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. +# +# ------------------------------------------------------------------------------ + +"""Wrapper for the BalanceTrackerFixedPriceToken marketplace contract.""" + +from typing import Dict + +from aea.common import JSONLike +from aea.configurations.base import PublicId +from aea.contracts.base import Contract +from aea.crypto.base import LedgerApi +from aea_ledger_ethereum import EthereumApi + +PUBLIC_ID = PublicId.from_str("valory/balance_tracker_fixed_price_token:0.1.0") + + +class BalanceTrackerFixedPriceToken(Contract): + """Balance tracker for the fixed-price ERC20 token payment model. + + Exposes the two operations the off-chain request behaviour needs when + auto-resolving a structured 402 challenge: read the requester's prepaid + balance (to decide whether to retry-only, deposit-and-retry, or fail + over the cap) and produce calldata for ``depositFor`` (one half of the + Safe-multisend that approves and then funds the BalanceTracker). + """ + + contract_id = PUBLIC_ID + + @classmethod + def get_balance( + cls, + ledger_api: EthereumApi, + contract_address: str, + account: str, + ) -> JSONLike: + """Read the prepaid balance for ``account`` on this BalanceTracker. + + Mirrors the contract's ``mapRequesterBalances(account)`` getter. + Returned value is in the token's smallest denomination. + + :param ledger_api: the ledger API object. + :param contract_address: the BalanceTracker contract address. + :param account: the requester address whose balance to read. + :return: ``{"balance": int}`` matching the ``GET_STATE`` shape. + """ + contract_address = ledger_api.api.to_checksum_address(contract_address) + account = ledger_api.api.to_checksum_address(account) + contract_instance = cls.get_instance(ledger_api, contract_address) + balance = contract_instance.functions.mapRequesterBalances(account).call() + return dict(balance=balance) + + @classmethod + def get_token( + cls, + ledger_api: EthereumApi, + contract_address: str, + ) -> JSONLike: + """Read the ERC20 ``token`` address this BalanceTracker accepts. + + The off-chain request behaviour cross-checks this against the + ``asset`` field of a structured 402 challenge before approving + any spend. Without the check a compromised mech could direct the + Safe to approve an attacker-chosen token (or an arbitrary + contract that happens to expose ``approve``); pinning the + approval target to the marketplace's on-chain registry blocks + that. + + :param ledger_api: the ledger API object. + :param contract_address: the BalanceTracker contract address. + :return: ``{"token": "0x…"}`` matching the ``GET_STATE`` shape. + """ + contract_address = ledger_api.api.to_checksum_address(contract_address) + contract_instance = cls.get_instance(ledger_api, contract_address) + token = contract_instance.functions.token().call() + return dict(token=str(token)) + + @classmethod + def build_deposit_for_data( + cls, + ledger_api: LedgerApi, + contract_address: str, + account: str, + amount: int, + ) -> Dict[str, bytes]: + """Encode the calldata for ``depositFor(account, amount)``. + + Returned as raw bytes ready to drop into a Safe multisend batch + alongside the ERC20 approval. The token transfer happens via + ``transferFrom(msg.sender, ...)`` on the BalanceTracker side, so the + approval must be granted by the same caller (the Safe) before this + call lands. + + :param ledger_api: the ledger API object. + :param contract_address: the BalanceTracker contract address. + :param account: the requester address being credited. + :param amount: the deposit amount in the token's smallest unit. + :return: ``{"data": bytes}`` calldata for the multisend batch. + """ + contract_instance = cls.get_instance(ledger_api, contract_address) + account = ledger_api.api.to_checksum_address(account) + data = contract_instance.encode_abi("depositFor", args=(account, amount)) + return {"data": bytes.fromhex(data[2:])} diff --git a/packages/valory/contracts/balance_tracker_fixed_price_token/contract.yaml b/packages/valory/contracts/balance_tracker_fixed_price_token/contract.yaml new file mode 100644 index 0000000000..c4d1e2c085 --- /dev/null +++ b/packages/valory/contracts/balance_tracker_fixed_price_token/contract.yaml @@ -0,0 +1,20 @@ +name: balance_tracker_fixed_price_token +author: valory +version: 0.1.0 +type: contract +description: Balance tracker contract for the fixed-price ERC20 token payment model. +license: Apache-2.0 +aea_version: '>=2.0.0, <3.0.0' +fingerprint: + README.md: bafybeie7v6de6ncc2hrzpafqa3x6rjucedlhrc6ldqondzdckndn5qvkji + __init__.py: bafybeiful6vpmllhury2bosawts4h36olgdz7bjuebznjfhkzic5kd74uq + build/balance_tracker_fixed_price_token.json: bafybeiavrhhnrvhaxosbxlm7e32a7wtoue4cyekb4k5yd2jlcbq2bs6tdu + contract.py: bafybeiewvjspslbrcnppnini67xnaxdpj2azta3flx7or75sowmex4thaq +fingerprint_ignore_patterns: [] +contracts: [] +class_name: BalanceTrackerFixedPriceToken +contract_interface_paths: + ethereum: build/balance_tracker_fixed_price_token.json +dependencies: + open-aea-ledger-ethereum: + version: ==2.2.7 diff --git a/packages/valory/contracts/mech_marketplace/README.md b/packages/valory/contracts/mech_marketplace/README.md new file mode 100644 index 0000000000..7a33aee55d --- /dev/null +++ b/packages/valory/contracts/mech_marketplace/README.md @@ -0,0 +1 @@ +# MechMarketplace contract diff --git a/packages/valory/contracts/mech_marketplace/__init__.py b/packages/valory/contracts/mech_marketplace/__init__.py new file mode 100644 index 0000000000..96a15d1778 --- /dev/null +++ b/packages/valory/contracts/mech_marketplace/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2026 Valory AG +# +# 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. +# +# ------------------------------------------------------------------------------ + +"""This module contains the MechMarketplace contract.""" diff --git a/packages/valory/contracts/mech_marketplace/build/mech_marketplace.json b/packages/valory/contracts/mech_marketplace/build/mech_marketplace.json new file mode 100644 index 0000000000..252b0bf034 --- /dev/null +++ b/packages/valory/contracts/mech_marketplace/build/mech_marketplace.json @@ -0,0 +1,1290 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "MechMarketplace", + "sourceName": "contracts/MechMarketplace.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_serviceRegistry", + "type": "address" + }, + { + "internalType": "address", + "name": "_karma", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AlreadyInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "requestId", + "type": "bytes32" + } + ], + "name": "AlreadyRequested", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "IncorrectSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "current", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "required", + "type": "uint256" + } + ], + "name": "InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "NoDepositAllowed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "OutOfBounds", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "Overflow", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnerOnly", + "type": "error" + }, + { + "inputs": [], + "name": "ReentrancyGuard", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "SignatureNotValidated", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "TransferFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "UnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numValues1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numValues2", + "type": "uint256" + } + ], + "name": "WrongArrayLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "paymentType", + "type": "bytes32" + } + ], + "name": "WrongPaymentType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "state", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" + } + ], + "name": "WrongServiceState", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroValue", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "mech", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "mechFactory", + "type": "address" + } + ], + "name": "CreateMech", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "mech", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "mechServiceMultisig", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "requestId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "deliveryRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "Deliver", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "ImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "deliveryMech", + "type": "address" + }, + { + "indexed": true, + "internalType": "address[]", + "name": "requesters", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "numDeliveries", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32[]", + "name": "requestIds", + "type": "bytes32[]" + }, + { + "indexed": false, + "internalType": "bool[]", + "name": "deliveredRequests", + "type": "bool[]" + } + ], + "name": "MarketplaceDelivery", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "deliveryMech", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "numDeliveries", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32[]", + "name": "requestIds", + "type": "bytes32[]" + } + ], + "name": "MarketplaceDeliveryWithSignatures", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minResponseTimeout", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maxResponseTimeout", + "type": "uint256" + } + ], + "name": "MarketplaceParamsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "priorityMech", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "numRequests", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32[]", + "name": "requestIds", + "type": "bytes32[]" + } + ], + "name": "MarketplaceRequest", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnerUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address[]", + "name": "mechFactories", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "bool[]", + "name": "statuses", + "type": "bool[]" + } + ], + "name": "SetMechFactoryStatuses", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32[]", + "name": "paymentTypes", + "type": "bytes32[]" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "balanceTrackers", + "type": "address[]" + } + ], + "name": "SetPaymentTypeBalanceTrackers", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR_TYPE_HASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE_FACTOR", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MECH_MARKETPLACE_PROXY", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "chainId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "changeImplementation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newMinResponseTimeout", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newMaxResponseTimeout", + "type": "uint256" + } + ], + "name": "changeMarketplaceParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "changeOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "mech", + "type": "address" + } + ], + "name": "checkMech", + "outputs": [ + { + "internalType": "address", + "name": "multisig", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "mechFactory", + "type": "address" + }, + { + "internalType": "bytes", + "name": "payload", + "type": "bytes" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "mech", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "requestIds", + "type": "bytes32[]" + }, + { + "internalType": "uint256[]", + "name": "deliveryRates", + "type": "uint256[]" + } + ], + "name": "deliverMarketplace", + "outputs": [ + { + "internalType": "bool[]", + "name": "deliveredRequests", + "type": "bool[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "requestData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "deliveryData", + "type": "bytes" + } + ], + "internalType": "struct DeliverWithSignature[]", + "name": "deliverWithSignatures", + "type": "tuple[]" + }, + { + "internalType": "uint256[]", + "name": "deliveryRates", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "paymentData", + "type": "bytes" + } + ], + "name": "deliverMarketplaceWithSignatures", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "domainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "mech", + "type": "address" + }, + { + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "deliveryRate", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "paymentType", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "name": "getRequestId", + "outputs": [ + { + "internalType": "bytes32", + "name": "requestId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "requestId", + "type": "bytes32" + } + ], + "name": "getRequestStatus", + "outputs": [ + { + "internalType": "enum MechMarketplace.RequestStatus", + "name": "status", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_minResponseTimeout", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxResponseTimeout", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "karma", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapAgentMechFactories", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapDeliveryCounts", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapMechDeliveryCounts", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapMechFactories", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapMechServiceDeliveryCounts", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapNonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "mapPaymentTypeBalanceTrackers", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapRequestCounts", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "mapRequestIdInfos", + "outputs": [ + { + "internalType": "address", + "name": "priorityMech", + "type": "address" + }, + { + "internalType": "address", + "name": "deliveryMech", + "type": "address" + }, + { + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "internalType": "uint256", + "name": "responseTimeout", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deliveryRate", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "paymentType", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxResponseTimeout", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minResponseTimeout", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "numMechs", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "numTotalRequests", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "numUndeliveredRequests", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "requestData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "maxDeliveryRate", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "paymentType", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "priorityMech", + "type": "address" + }, + { + "internalType": "uint256", + "name": "responseTimeout", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymentData", + "type": "bytes" + } + ], + "name": "request", + "outputs": [ + { + "internalType": "bytes32", + "name": "requestId", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "requestDatas", + "type": "bytes[]" + }, + { + "internalType": "uint256", + "name": "maxDeliveryRate", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "paymentType", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "priorityMech", + "type": "address" + }, + { + "internalType": "uint256", + "name": "responseTimeout", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymentData", + "type": "bytes" + } + ], + "name": "requestBatch", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "requestIds", + "type": "bytes32[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "serviceRegistry", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "mechFactories", + "type": "address[]" + }, + { + "internalType": "bool[]", + "name": "statuses", + "type": "bool[]" + } + ], + "name": "setMechFactoryStatuses", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "paymentTypes", + "type": "bytes32[]" + }, + { + "internalType": "address[]", + "name": "balanceTrackers", + "type": "address[]" + } + ], + "name": "setPaymentTypeBalanceTrackers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60e060405234801561000f575f5ffd5b506040516146b33803806146b383398101604081905261002e9161009f565b6001600160a01b038216158061004b57506001600160a01b038116155b156100695760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0391821660c0521660a052466080526100d0565b80516001600160a01b038116811461009a575f5ffd5b919050565b5f5f604083850312156100b0575f5ffd5b6100b983610084565b91506100c760208401610084565b90509250929050565b60805160a05160c05161457a6101395f395f818161077401528181610ea401528181610f5d015261110c01525f818161051a01528181611a8001528181611cd1015281816128fe0152818161298801526132d401525f818161066b0152612273015261457a5ff3fe608060405260043610610290575f3560e01c80638da5cb5b11610165578063d64bf8b0116100c6578063ed24911d1161007c578063f6938b0911610062578063f6938b0914610899578063f698da25146108ac578063ffa1ad74146108c0575f5ffd5b8063ed24911d14610852578063f5dcb7bb14610866575f5ffd5b8063ded81286116100ac578063ded81286146107f5578063e0cb19e81461080a578063e8eca22d1461081f575f5ffd5b8063d64bf8b0146107c1578063ddca3f43146107e0575f5ffd5b8063bdf863171161011b578063c7b6a9f011610101578063c7b6a9f014610743578063cbcf252a14610763578063cbd6407a14610796575f5ffd5b8063bdf86317146106ed578063c69f6f9f14610702575f5ffd5b80639e592bb91161014b5780639e592bb91461068d578063a6f9dae1146106b9578063af4937fc146106d8575f5ffd5b80638da5cb5b1461062e5780639a8a05921461065a575f5ffd5b806345d076641161020f57806357c0762d116101c55780637ecb65f6116101ab5780637ecb65f61461053c57806380d859111461055b5780638342d20e1461057a575f5ffd5b806357c0762d146104ea57806374a8569b14610509575f5ffd5b80634ada3e61116101f55780634ada3e61146104755780634e894dd11461048a5780634eb07dd3146104a9575f5ffd5b806345d076641461042a57806346fbcbb214610456575f5ffd5b8063176b8b01116102645780631bbbeeb81161024a5780631bbbeeb8146103905780632685937b146103bb57806343be9643146103ff575f5ffd5b8063176b8b011461034657806317a68dd814610371575f5ffd5b8062427c5414610294578063087f08d4146102d25780630f41196a146102f35780631399991414610308575b5f5ffd5b34801561029f575f5ffd5b506102bf6102ae3660046137ac565b600a6020525f908152604090205481565b6040519081526020015b60405180910390f35b3480156102dd575f5ffd5b506102f16102ec366004613816565b610915565b005b3480156102fe575f5ffd5b506102bf60025481565b348015610313575f5ffd5b506103366103223660046137ac565b600e6020525f908152604090205460ff1681565b60405190151581526020016102c9565b348015610351575f5ffd5b506102bf6103603660046137ac565b600b6020525f908152604090205481565b34801561037c575f5ffd5b506102f161038b3660046137ac565b610b3e565b34801561039b575f5ffd5b506102bf6103aa3660046137ac565b60096020525f908152604090205481565b3480156103c6575f5ffd5b506103da6103d53660046137ac565b610c65565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c9565b34801561040a575f5ffd5b506102bf6104193660046137ac565b600c6020525f908152604090205481565b348015610435575f5ffd5b50610449610444366004613882565b610d9b565b6040516102c99190613899565b348015610461575f5ffd5b506103da6104703660046139de565b610e5c565b348015610480575f5ffd5b506102bf60055481565b348015610495575f5ffd5b506102f16104a4366004613a71565b611290565b3480156104b4575f5ffd5b506103da6104c3366004613882565b60106020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156104f5575f5ffd5b506102f1610504366004613b22565b611491565b348015610514575f5ffd5b506103da7f000000000000000000000000000000000000000000000000000000000000000081565b348015610547575f5ffd5b506102bf610556366004613b4b565b611555565b348015610566575f5ffd5b506102f1610575366004613b22565b61161f565b348015610585575f5ffd5b506105e3610594366004613882565b600d6020525f908152604090208054600182015460028301546003840154600485015460059095015473ffffffffffffffffffffffffffffffffffffffff948516959385169490921692909186565b6040805173ffffffffffffffffffffffffffffffffffffffff9788168152958716602087015293909516928401929092526060830152608082015260a081019190915260c0016102c9565b348015610639575f5ffd5b506008546103da9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610665575f5ffd5b506102bf7f000000000000000000000000000000000000000000000000000000000000000081565b348015610698575f5ffd5b506106ac6106a7366004613816565b6116b8565b6040516102c99190613c00565b3480156106c4575f5ffd5b506102f16106d33660046137ac565b611e89565b3480156106e3575f5ffd5b506102bf61271081565b3480156106f8575f5ffd5b506102bf60045481565b34801561070d575f5ffd5b506103da61071c3660046137ac565b600f6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b610756610751366004613c12565b611fb7565b6040516102c99190613d4b565b34801561076e575f5ffd5b506103da7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a1575f5ffd5b506102bf6107b03660046137ac565b60116020525f908152604090205481565b3480156107cc575f5ffd5b506102f16107db366004613816565b61201a565b3480156107eb575f5ffd5b506102bf60015481565b348015610800575f5ffd5b506102bf60035481565b348015610815575f5ffd5b506102bf60065481565b34801561082a575f5ffd5b506102bf7fe6194b93a7bff0a54130ed8cd277223408a77f3e48bb5104a9db96d334f962ca81565b34801561085d575f5ffd5b506102bf612270565b348015610871575f5ffd5b506102bf7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6102bf6108a7366004613d5d565b6122ab565b3480156108b7575f5ffd5b506102bf5f5481565b3480156108cb575f5ffd5b506109086040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102c99190613e00565b60085473ffffffffffffffffffffffffffffffffffffffff16331461098d576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b8281146109d0576040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610984565b5f5b83811015610afa575f8585838181106109ed576109ed613e12565b9050602002016020810190610a0291906137ac565b73ffffffffffffffffffffffffffffffffffffffff1603610a4f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828282818110610a6157610a61613e12565b9050602002016020810190610a769190613e4e565b600e5f878785818110610a8b57610a8b613e12565b9050602002016020810190610aa091906137ac565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556001016109d2565b507f8cc6be981009d13170c616af494b7d671ed2d84b7e6891e4c8f21fe065c00dfc84848484604051610b309493929190613eb2565b60405180910390a150505050565b60085473ffffffffffffffffffffffffffffffffffffffff163314610bb1576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610984565b73ffffffffffffffffffffffffffffffffffffffff8116610bfe576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe6194b93a7bff0a54130ed8cd277223408a77f3e48bb5104a9db96d334f962ca81905560405173ffffffffffffffffffffffffffffffffffffffff8216907f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03905f90a250565b5f73ffffffffffffffffffffffffffffffffffffffff8216610cb3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281165f908152600f602052604090205416610d28576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610984565b8173ffffffffffffffffffffffffffffffffffffffff1663e7f43c686040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d71573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d959190613f0c565b92915050565b5f818152600d60209081526040808320815160c081018352815473ffffffffffffffffffffffffffffffffffffffff90811680835260018401548216958301959095526002830154169281019290925260038101546060830152600481015460808301526005015460a082015290610e1557505f92915050565b602081015173ffffffffffffffffffffffffffffffffffffffff1615610e3e5750600392915050565b8060600151421115610e535750600292915050565b50600192915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018490525f90819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015610ee9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0d9190613f0c565b90503373ffffffffffffffffffffffffffffffffffffffff82161461104c576040517f4236aff8000000000000000000000000000000000000000000000000000000008152600481018690525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634236aff89060240160e060405180830381865afa158015610fb7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fdb9190613f3a565b50505050509150508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461104a576040517f32b2baa3000000000000000000000000000000000000000000000000000000008152336004820152602401610984565b505b73ffffffffffffffffffffffffffffffffffffffff84165f908152600e602052604090205460ff166110c2576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610984565b6040517f0f7fb56d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690630f7fb56d90611138907f00000000000000000000000000000000000000000000000000000000000000009089908890600401613fd1565b6020604051808303815f875af1158015611154573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111789190613f0c565b915073ffffffffffffffffffffffffffffffffffffffff82166111c7576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281165f908152600f6020526040812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169287169290921790915560068054916112288361403b565b91905055508373ffffffffffffffffffffffffffffffffffffffff16858373ffffffffffffffffffffffffffffffffffffffff167f46e1ca45c09520471c43e2e88eca33bb51803011cfd456933629dcc645ecacd660405160405180910390a4509392505050565b6007546002036112cc576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026007558415806112de5750848314155b1561131f576040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810186905260248101849052604401610984565b5f3373ffffffffffffffffffffffffffffffffffffffff16632763b8da6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611369573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061138d9190614072565b905061139d88828989898961239c565b5f8181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff16806113f8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f6072dd2c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636072dd2c906114549033908d908b908b908b908b90600401614119565b5f604051808303815f87803b15801561146b575f5ffd5b505af115801561147d573d5f5f3e3d5ffd5b505060016007555050505050505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff163314611504576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610984565b61150f838383612acf565b60408051848152602081018490529081018290527f64d0972bd5d0c2828d80911b61084d86d61214c3081656ca3a720047a88320359060600160405180910390a1505050565b5f61155e612270565b85516020968701206040805130818a015273ffffffffffffffffffffffffffffffffffffffff9a8b1681830152989099166060890152608088015260a08701949094525060c085019190915260e08085019190915284518085039091018152610100840185528051908301207f19010000000000000000000000000000000000000000000000000000000000006101208501526101228401919091526101428084019190915283518084039091018152610162909201909252805191012090565b60085473ffffffffffffffffffffffffffffffffffffffff161561166f576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61167a838383612acf565b611682612bf5565b5f555050600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055506001600755565b60606007546002036116f6576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026007558315806117085750838214155b15611749576040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604401610984565b5f61175333610c65565b90505f858067ffffffffffffffff811115611770576117706138d8565b604051908082528060200260200182016040528015611799578160200160208202803683370190505b5093505f8167ffffffffffffffff8111156117b6576117b66138d8565b6040519080825280602002602001820160405280156117df578160200160208202803683370190505b5090505f8267ffffffffffffffff8111156117fc576117fc6138d8565b604051908082528060200260200182016040528015611825578160200160208202803683370190505b5090505f3373ffffffffffffffffffffffffffffffffffffffff16632763b8da6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611872573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118969190614072565b90505f5b84811015611c23575f600d5f8e8e858181106118b8576118b8613e12565b602090810292909201358352508101919091526040015f20805490915073ffffffffffffffffffffffffffffffffffffffff1680611922576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83826005015414611962576040517f7fec71d700000000000000000000000000000000000000000000000000000000815260048101859052602401610984565b600182015473ffffffffffffffffffffffffffffffffffffffff1615611989575050611c1b565b81600401548584815181106119a0576119a0613e12565b6020026020010181815250508483815181106119be576119be613e12565b60200260200101518c8c858181106119d8576119d8613e12565b9050602002013511156119ec575050611c1b565b73ffffffffffffffffffffffffffffffffffffffff81163314611ae3578160030154421115611adc576040517f4225d37a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248301527f00000000000000000000000000000000000000000000000000000000000000001690634225d37a906044015f604051808303815f87803b158015611ac1575f5ffd5b505af1158015611ad3573d5f5f3e3d5ffd5b50505050611ae3565b5050611c1b565b6001820180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790556002820154865173ffffffffffffffffffffffffffffffffffffffff9190911690879085908110611b4257611b42613e12565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a5f878581518110611b9157611b91613e12565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190611be29061403b565b919050555060018a8481518110611bfb57611bfb613e12565b9115156020928302919091019091015287611c158161403b565b98505050505b60010161189a565b508415611e0b578460045f828254611c3b9190614184565b9091555050335f908152600b602052604081208054879290611c5e908490614197565b909155505073ffffffffffffffffffffffffffffffffffffffff86165f908152600c602052604081208054879290611c97908490614197565b90915550506040517f4225d37a000000000000000000000000000000000000000000000000000000008152336004820152602481018690527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634225d37a906044015f604051808303815f87803b158015611d27575f5ffd5b505af1158015611d39573d5f5f3e3d5ffd5b5050505f8281526010602052604090205473ffffffffffffffffffffffffffffffffffffffff16905080611d99576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166379e4afe833868b8e8e896040518763ffffffff1660e01b8152600401611ddc969594939291906141aa565b5f604051808303815f87803b158015611df3575f5ffd5b505af1158015611e05573d5f5f3e3d5ffd5b50505050505b82604051611e199190614255565b60405180910390203373ffffffffffffffffffffffffffffffffffffffff167f894bb814a80f77e14febccf552394d95b38cc21a6dda1b0cf26434433fdf3e4c878e8e8c604051611e6d94939291906142a0565b60405180910390a3505060016007555092979650505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff163314611efc576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610984565b73ffffffffffffffffffffffffffffffffffffffff8116611f49576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b905f90a250565b6060600754600203611ff5576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260075561200988888888888888612cf3565b600160075598975050505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff16331461208d576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610984565b8281146120d0576040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610984565b5f5b8381101561223a578484828181106120ec576120ec613e12565b905060200201355f5f1b0361212d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83838381811061214057612140613e12565b905060200201602081019061215591906137ac565b73ffffffffffffffffffffffffffffffffffffffff16036121a2576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8282828181106121b4576121b4613e12565b90506020020160208101906121c991906137ac565b60105f8787858181106121de576121de613e12565b9050602002013581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060010190506120d2565b507fa9759667b17e564f26a0d91ce1c5e4a1dc3910aee992dc3f5f4da0a59d48f3cb84848484604051610b3094939291906142d6565b5f7f000000000000000000000000000000000000000000000000000000000000000046146122a5576122a0612bf5565b905090565b505f5490565b5f6007546002036122e8576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026007556040805160018082528183019092525f91816020015b60608152602001906001900390816123035750506040805160018082528183019092529192505f91906020808301908036833701905050905089825f8151811061234f5761234f613e12565b6020026020010181905250612369828a8a8a8a8a8a612cf3565b9050805f8151811061237d5761237d613e12565b6020026020010151925060016007819055505050979650505050505050565b5f6123a633610c65565b9050835f8167ffffffffffffffff8111156123c3576123c36138d8565b6040519080825280602002602001820160405280156123ec578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff8a165f908152601160205260408120549192505b838110156127b85788888281811061243057612430613e12565b905060200281019061244291906142fc565b61244c9080614338565b90505f03612486576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61250f338c8b8b8581811061249d5761249d613e12565b90506020028101906124af91906142fc565b6124b99080614338565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508d92508c915087905081811061250157612501613e12565b905060200201358e87611555565b83828151811061252157612521613e12565b6020026020010181815250506125b68b84838151811061254357612543613e12565b60200260200101518b8b8581811061255d5761255d613e12565b905060200281019061256f91906142fc565b61257d906020810190614338565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061346392505050565b5f600d5f8584815181106125cc576125cc613e12565b60209081029190910181015182528101919091526040015f20805490915073ffffffffffffffffffffffffffffffffffffffff16156126545783828151811061261757612617613e12565b60200260200101516040517fec0db69800000000000000000000000000000000000000000000000000000000815260040161098491815260200190565b8054337fffffffffffffffffffffffff0000000000000000000000000000000000000000918216811783556001830180548316909117905560028201805490911673ffffffffffffffffffffffffffffffffffffffff8e161790558787838181106126c1576126c1613e12565b6020029190910135600483015550600581018b9055826126e08161403b565b9350508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb0d013658abb05dd269ff3ab257175d5ae3fa4107d4e142abd96e947cd5cb06f86858151811061274457612744613e12565b60200260200101518b8b8781811061275e5761275e613e12565b905060200201358e8e8881811061277757612777613e12565b905060200281019061278991906142fc565b612797906040810190614338565b6040516127a79493929190614399565b60405180910390a350600101612416565b5073ffffffffffffffffffffffffffffffffffffffff8a165f9081526011602090815260408083208490556009909152812080548592906127fa908490614197565b909155505073ffffffffffffffffffffffffffffffffffffffff8a165f908152600a602052604081208054859290612833908490614197565b9091555050335f908152600b602052604081208054859290612856908490614197565b909155505073ffffffffffffffffffffffffffffffffffffffff84165f908152600c60205260408120805485929061288f908490614197565b925050819055508260055f8282546128a79190614197565b90915550506040517f55e7d04400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152336024830152604482018590527f000000000000000000000000000000000000000000000000000000000000000016906355e7d044906064015f604051808303815f87803b15801561293f575f5ffd5b505af1158015612951573d5f5f3e3d5ffd5b50506040517f4225d37a000000000000000000000000000000000000000000000000000000008152336004820152602481018690527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169250634225d37a91506044015f604051808303815f87803b1580156129e0575f5ffd5b505af11580156129f2573d5f5f3e3d5ffd5b50506040517f9680b60300000000000000000000000000000000000000000000000000000000815260048101869052339250639680b60391506024015f604051808303815f87803b158015612a45575f5ffd5b505af1158015612a57573d5f5f3e3d5ffd5b505050508973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff980d83e9456535b0f9f3634d171df2a5f052f5d5e706b75d30c4e0433da927d845185604051612abb9291906143c2565b60405180910390a350505050505050505050565b811580612ada575080155b15612b11576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710831115612b58576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526127106024820152604401610984565b80821115612b9c576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610984565b63ffffffff811115612be7576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810182905263ffffffff6024820152604401610984565b600192909255600255600355565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ff376b6313a0837eb351511248cfe7dcc1cd26c49b8e0a47e1eb369dd62c425db6040518060400160405280600581526020017f312e312e30000000000000000000000000000000000000000000000000000000815250604051602001612c7e9190613e00565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b606063ffffffff612d044286614197565b1115612d5457612d144285614197565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019190915263ffffffff6024820152604401610984565b600254841080612d65575060035484115b15612db2576002546003546040517feb373cfe0000000000000000000000000000000000000000000000000000000081526004810187905260248101929092526044820152606401610984565b861580612dbd575085155b15612df4576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87515f819003612e30576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e3986610c65565b508067ffffffffffffffff811115612e5357612e536138d8565b604051908082528060200260200182016040528015612e7c578160200160208202803683370190505b5091505f8673ffffffffffffffffffffffffffffffffffffffff16632cc0fcb26040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ec9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eed9190614072565b905088811115612f33576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052602481018a9052604401610984565b8673ffffffffffffffffffffffffffffffffffffffff16632763b8da6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f7c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fa09190614072565b8814612fdb576040517f7fec71d700000000000000000000000000000000000000000000000000000000815260048101899052602401610984565b335f90815260116020526040812054905b8b5181101561318e578b818151811061300757613007613e12565b6020026020010151515f03613048576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61306f89338e848151811061305f5761305f613e12565b6020026020010151868e87611555565b85828151811061308157613081613e12565b6020026020010181815250505f600d5f8784815181106130a3576130a3613e12565b60209081029190910181015182528101919091526040015f20805490915073ffffffffffffffffffffffffffffffffffffffff16156130ee5785828151811061261757612617613e12565b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8b16178155613136428a614197565b60038201556002810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905560048101849055600581018b90558261317f8161403b565b93505050806001019050612fec565b50335f9081526011602090815260408083208490558b8352601090915290205473ffffffffffffffffffffffffffffffffffffffff16806131fb576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f38603a3900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216906338603a39903490613257903390899089908e908e906004016143e2565b5f604051808303818588803b15801561326e575f5ffd5b505af1158015613280573d5f5f3e3d5ffd5b50506040517f55e7d04400000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8d81166024830152604482018990527f00000000000000000000000000000000000000000000000000000000000000001693506355e7d044925060640190505f604051808303815f87803b158015613319575f5ffd5b505af115801561332b573d5f5f3e3d5ffd5b5050335f908152600960205260408120805488945090925061334e908490614197565b925050819055508360045f8282546133669190614197565b925050819055508360055f82825461337e9190614197565b925050819055508873ffffffffffffffffffffffffffffffffffffffff1663be2641de868e6040518363ffffffff1660e01b81526004016133c092919061441d565b5f604051808303815f87803b1580156133d7575f5ffd5b505af11580156133e9573d5f5f3e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f5d60556939d4ab71b3129033c865bf7e828306916fd94fd35019d3d530eb36b3868860405161344c9291906143c2565b60405180910390a350505050979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff83166134b0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83163b156135c6576040517f1626ba7e000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff851690631626ba7e9061352390869086906004016144b0565b602060405180830381865afa15801561353e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061356291906144c8565b7fffffffff00000000000000000000000000000000000000000000000000000000160361358e57505050565b8282826040517f02d51bb200000000000000000000000000000000000000000000000000000000815260040161098493929190613fd1565b80516041146136085780516040517f1d9f5a5f000000000000000000000000000000000000000000000000000000008152610984918391604190600401614507565b5f8160408151811061361c5761361c613e12565b016020015160f81c9050600481101561363d5761363a601b8261452b565b90505b602082015160408301517f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08111156136a7578585856040517f02d51bb200000000000000000000000000000000000000000000000000000000815260040161098493929190613fd1565b604080515f8082526020820180845288905260ff861692820192909252606081018490526080810183905260019060a0016020604051602081039080840390855afa1580156136f8573d5f5f3e3d5ffd5b5050506020604051035190508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461376f578686866040517f02d51bb200000000000000000000000000000000000000000000000000000000815260040161098493929190613fd1565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114613799575f5ffd5b50565b80356137a781613778565b919050565b5f602082840312156137bc575f5ffd5b81356137c781613778565b9392505050565b5f5f83601f8401126137de575f5ffd5b50813567ffffffffffffffff8111156137f5575f5ffd5b6020830191508360208260051b850101111561380f575f5ffd5b9250929050565b5f5f5f5f60408587031215613829575f5ffd5b843567ffffffffffffffff81111561383f575f5ffd5b61384b878288016137ce565b909550935050602085013567ffffffffffffffff81111561386a575f5ffd5b613876878288016137ce565b95989497509550505050565b5f60208284031215613892575f5ffd5b5035919050565b60208101600483106138d2577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561394c5761394c6138d8565b604052919050565b5f82601f830112613963575f5ffd5b813567ffffffffffffffff81111561397d5761397d6138d8565b6139ae60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613905565b8181528460208386010111156139c2575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f606084860312156139f0575f5ffd5b833592506020840135613a0281613778565b9150604084013567ffffffffffffffff811115613a1d575f5ffd5b613a2986828701613954565b9150509250925092565b5f5f83601f840112613a43575f5ffd5b50813567ffffffffffffffff811115613a5a575f5ffd5b60208301915083602082850101111561380f575f5ffd5b5f5f5f5f5f5f5f6080888a031215613a87575f5ffd5b8735613a9281613778565b9650602088013567ffffffffffffffff811115613aad575f5ffd5b613ab98a828b016137ce565b909750955050604088013567ffffffffffffffff811115613ad8575f5ffd5b613ae48a828b016137ce565b909550935050606088013567ffffffffffffffff811115613b03575f5ffd5b613b0f8a828b01613a33565b989b979a50959850939692959293505050565b5f5f5f60608486031215613b34575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f5f5f5f60c08789031215613b60575f5ffd5b8635613b6b81613778565b95506020870135613b7b81613778565b9450604087013567ffffffffffffffff811115613b96575f5ffd5b613ba289828a01613954565b969995985095966060810135965060808101359560a090910135945092505050565b5f8151808452602084019350602083015f5b82811015613bf65781511515865260209586019590910190600101613bd6565b5093949350505050565b602081525f6137c76020830184613bc4565b5f5f5f5f5f5f5f60c0888a031215613c28575f5ffd5b873567ffffffffffffffff811115613c3e575f5ffd5b8801601f81018a13613c4e575f5ffd5b803567ffffffffffffffff811115613c6857613c686138d8565b8060051b613c7860208201613905565b9182526020818401810192908101908d841115613c93575f5ffd5b6020850192505b83831015613cd957823567ffffffffffffffff811115613cb8575f5ffd5b613cc78f602083890101613954565b83525060209283019290910190613c9a565b9a50505050602089013596505060408801359450613cf96060890161379c565b93506080880135925060a088013567ffffffffffffffff811115613b03575f5ffd5b5f8151808452602084019350602083015f5b82811015613bf6578151865260209586019590910190600101613d2d565b602081525f6137c76020830184613d1b565b5f5f5f5f5f5f5f60c0888a031215613d73575f5ffd5b873567ffffffffffffffff811115613d89575f5ffd5b613d958a828b01613954565b97505060208801359550604088013594506060880135613cf981613778565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6137c76020830184613db4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b803580151581146137a7575f5ffd5b5f60208284031215613e5e575f5ffd5b6137c782613e3f565b8183526020830192505f815f5b84811015613bf6578135613e8781613778565b73ffffffffffffffffffffffffffffffffffffffff1686526020958601959190910190600101613e74565b604081525f613ec5604083018688613e67565b8281036020808501919091528482528591015f5b85811015613f0057613eea83613e3f565b1515825260209283019290910190600101613ed9565b50979650505050505050565b5f60208284031215613f1c575f5ffd5b81516137c781613778565b805163ffffffff811681146137a7575f5ffd5b5f5f5f5f5f5f5f60e0888a031215613f50575f5ffd5b87516bffffffffffffffffffffffff81168114613f6b575f5ffd5b6020890151909750613f7c81613778565b60408901519096509450613f9260608901613f27565b9350613fa060808901613f27565b9250613fae60a08901613f27565b915060c088015160068110613fc1575f5ffd5b8091505092959891949750929550565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6140056060830184613db4565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361406b5761406b61400e565b5060010190565b5f60208284031215614082575f5ffd5b5051919050565b8183525f7f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156140b9575f5ffd5b8260051b80836020870137939093016020019392505050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff86166020820152608060408201525f614164608083018688614089565b82810360608401526141778185876140d2565b9998505050505050505050565b81810381811115610d9557610d9561400e565b80820180821115610d9557610d9561400e565b5f60a0820173ffffffffffffffffffffffffffffffffffffffff8916835260a0602084015280885180835260c08501915060208a0192505f5b8181101561421757835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016141e3565b5050838103604085015261422b8189613bc4565b9150508281036060840152614241818688614089565b905082810360808401526141778185613d1b565b81515f90829060208501835b8281101561429557815173ffffffffffffffffffffffffffffffffffffffff16845260209384019390910190600101614261565b509195945050505050565b848152606060208201525f6142b9606083018587614089565b82810360408401526142cb8185613bc4565b979650505050505050565b604081525f6142e9604083018688614089565b82810360208401526142cb818587613e67565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261432e575f5ffd5b9190910192915050565b5f5f83357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261436b575f5ffd5b83018035915067ffffffffffffffff821115614385575f5ffd5b60200191503681900382131561380f575f5ffd5b848152836020820152606060408201525f6143b86060830184866140d2565b9695505050505050565b828152604060208201525f6143da6040830184613d1b565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff86168152846020820152836040820152608060608201525f6142cb6080830184866140d2565b604081525f61442f6040830185613d1b565b828103602084015280845180835260208301915060208160051b840101602087015f5b838110156144a2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086840301855261448c838351613db4565b6020958601959093509190910190600101614452565b509098975050505050505050565b828152604060208201525f6143da6040830184613db4565b5f602082840312156144d8575f5ffd5b81517fffffffff00000000000000000000000000000000000000000000000000000000811681146137c7575f5ffd5b606081525f6145196060830186613db4565b60208301949094525060400152919050565b60ff8181168382160190811115610d9557610d9561400e56fea26469706673582212205361abf960db68d3b3bae8075574e1aeeffc915036bea9a2bf06b78902652cc364736f6c634300081c0033", + "deployedBytecode": "0x608060405260043610610290575f3560e01c80638da5cb5b11610165578063d64bf8b0116100c6578063ed24911d1161007c578063f6938b0911610062578063f6938b0914610899578063f698da25146108ac578063ffa1ad74146108c0575f5ffd5b8063ed24911d14610852578063f5dcb7bb14610866575f5ffd5b8063ded81286116100ac578063ded81286146107f5578063e0cb19e81461080a578063e8eca22d1461081f575f5ffd5b8063d64bf8b0146107c1578063ddca3f43146107e0575f5ffd5b8063bdf863171161011b578063c7b6a9f011610101578063c7b6a9f014610743578063cbcf252a14610763578063cbd6407a14610796575f5ffd5b8063bdf86317146106ed578063c69f6f9f14610702575f5ffd5b80639e592bb91161014b5780639e592bb91461068d578063a6f9dae1146106b9578063af4937fc146106d8575f5ffd5b80638da5cb5b1461062e5780639a8a05921461065a575f5ffd5b806345d076641161020f57806357c0762d116101c55780637ecb65f6116101ab5780637ecb65f61461053c57806380d859111461055b5780638342d20e1461057a575f5ffd5b806357c0762d146104ea57806374a8569b14610509575f5ffd5b80634ada3e61116101f55780634ada3e61146104755780634e894dd11461048a5780634eb07dd3146104a9575f5ffd5b806345d076641461042a57806346fbcbb214610456575f5ffd5b8063176b8b01116102645780631bbbeeb81161024a5780631bbbeeb8146103905780632685937b146103bb57806343be9643146103ff575f5ffd5b8063176b8b011461034657806317a68dd814610371575f5ffd5b8062427c5414610294578063087f08d4146102d25780630f41196a146102f35780631399991414610308575b5f5ffd5b34801561029f575f5ffd5b506102bf6102ae3660046137ac565b600a6020525f908152604090205481565b6040519081526020015b60405180910390f35b3480156102dd575f5ffd5b506102f16102ec366004613816565b610915565b005b3480156102fe575f5ffd5b506102bf60025481565b348015610313575f5ffd5b506103366103223660046137ac565b600e6020525f908152604090205460ff1681565b60405190151581526020016102c9565b348015610351575f5ffd5b506102bf6103603660046137ac565b600b6020525f908152604090205481565b34801561037c575f5ffd5b506102f161038b3660046137ac565b610b3e565b34801561039b575f5ffd5b506102bf6103aa3660046137ac565b60096020525f908152604090205481565b3480156103c6575f5ffd5b506103da6103d53660046137ac565b610c65565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c9565b34801561040a575f5ffd5b506102bf6104193660046137ac565b600c6020525f908152604090205481565b348015610435575f5ffd5b50610449610444366004613882565b610d9b565b6040516102c99190613899565b348015610461575f5ffd5b506103da6104703660046139de565b610e5c565b348015610480575f5ffd5b506102bf60055481565b348015610495575f5ffd5b506102f16104a4366004613a71565b611290565b3480156104b4575f5ffd5b506103da6104c3366004613882565b60106020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156104f5575f5ffd5b506102f1610504366004613b22565b611491565b348015610514575f5ffd5b506103da7f000000000000000000000000000000000000000000000000000000000000000081565b348015610547575f5ffd5b506102bf610556366004613b4b565b611555565b348015610566575f5ffd5b506102f1610575366004613b22565b61161f565b348015610585575f5ffd5b506105e3610594366004613882565b600d6020525f908152604090208054600182015460028301546003840154600485015460059095015473ffffffffffffffffffffffffffffffffffffffff948516959385169490921692909186565b6040805173ffffffffffffffffffffffffffffffffffffffff9788168152958716602087015293909516928401929092526060830152608082015260a081019190915260c0016102c9565b348015610639575f5ffd5b506008546103da9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610665575f5ffd5b506102bf7f000000000000000000000000000000000000000000000000000000000000000081565b348015610698575f5ffd5b506106ac6106a7366004613816565b6116b8565b6040516102c99190613c00565b3480156106c4575f5ffd5b506102f16106d33660046137ac565b611e89565b3480156106e3575f5ffd5b506102bf61271081565b3480156106f8575f5ffd5b506102bf60045481565b34801561070d575f5ffd5b506103da61071c3660046137ac565b600f6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b610756610751366004613c12565b611fb7565b6040516102c99190613d4b565b34801561076e575f5ffd5b506103da7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a1575f5ffd5b506102bf6107b03660046137ac565b60116020525f908152604090205481565b3480156107cc575f5ffd5b506102f16107db366004613816565b61201a565b3480156107eb575f5ffd5b506102bf60015481565b348015610800575f5ffd5b506102bf60035481565b348015610815575f5ffd5b506102bf60065481565b34801561082a575f5ffd5b506102bf7fe6194b93a7bff0a54130ed8cd277223408a77f3e48bb5104a9db96d334f962ca81565b34801561085d575f5ffd5b506102bf612270565b348015610871575f5ffd5b506102bf7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6102bf6108a7366004613d5d565b6122ab565b3480156108b7575f5ffd5b506102bf5f5481565b3480156108cb575f5ffd5b506109086040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102c99190613e00565b60085473ffffffffffffffffffffffffffffffffffffffff16331461098d576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b8281146109d0576040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610984565b5f5b83811015610afa575f8585838181106109ed576109ed613e12565b9050602002016020810190610a0291906137ac565b73ffffffffffffffffffffffffffffffffffffffff1603610a4f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828282818110610a6157610a61613e12565b9050602002016020810190610a769190613e4e565b600e5f878785818110610a8b57610a8b613e12565b9050602002016020810190610aa091906137ac565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556001016109d2565b507f8cc6be981009d13170c616af494b7d671ed2d84b7e6891e4c8f21fe065c00dfc84848484604051610b309493929190613eb2565b60405180910390a150505050565b60085473ffffffffffffffffffffffffffffffffffffffff163314610bb1576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610984565b73ffffffffffffffffffffffffffffffffffffffff8116610bfe576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe6194b93a7bff0a54130ed8cd277223408a77f3e48bb5104a9db96d334f962ca81905560405173ffffffffffffffffffffffffffffffffffffffff8216907f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03905f90a250565b5f73ffffffffffffffffffffffffffffffffffffffff8216610cb3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281165f908152600f602052604090205416610d28576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610984565b8173ffffffffffffffffffffffffffffffffffffffff1663e7f43c686040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d71573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d959190613f0c565b92915050565b5f818152600d60209081526040808320815160c081018352815473ffffffffffffffffffffffffffffffffffffffff90811680835260018401548216958301959095526002830154169281019290925260038101546060830152600481015460808301526005015460a082015290610e1557505f92915050565b602081015173ffffffffffffffffffffffffffffffffffffffff1615610e3e5750600392915050565b8060600151421115610e535750600292915050565b50600192915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018490525f90819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015610ee9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0d9190613f0c565b90503373ffffffffffffffffffffffffffffffffffffffff82161461104c576040517f4236aff8000000000000000000000000000000000000000000000000000000008152600481018690525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634236aff89060240160e060405180830381865afa158015610fb7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fdb9190613f3a565b50505050509150508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461104a576040517f32b2baa3000000000000000000000000000000000000000000000000000000008152336004820152602401610984565b505b73ffffffffffffffffffffffffffffffffffffffff84165f908152600e602052604090205460ff166110c2576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610984565b6040517f0f7fb56d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690630f7fb56d90611138907f00000000000000000000000000000000000000000000000000000000000000009089908890600401613fd1565b6020604051808303815f875af1158015611154573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111789190613f0c565b915073ffffffffffffffffffffffffffffffffffffffff82166111c7576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281165f908152600f6020526040812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169287169290921790915560068054916112288361403b565b91905055508373ffffffffffffffffffffffffffffffffffffffff16858373ffffffffffffffffffffffffffffffffffffffff167f46e1ca45c09520471c43e2e88eca33bb51803011cfd456933629dcc645ecacd660405160405180910390a4509392505050565b6007546002036112cc576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026007558415806112de5750848314155b1561131f576040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810186905260248101849052604401610984565b5f3373ffffffffffffffffffffffffffffffffffffffff16632763b8da6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611369573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061138d9190614072565b905061139d88828989898961239c565b5f8181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff16806113f8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f6072dd2c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636072dd2c906114549033908d908b908b908b908b90600401614119565b5f604051808303815f87803b15801561146b575f5ffd5b505af115801561147d573d5f5f3e3d5ffd5b505060016007555050505050505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff163314611504576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610984565b61150f838383612acf565b60408051848152602081018490529081018290527f64d0972bd5d0c2828d80911b61084d86d61214c3081656ca3a720047a88320359060600160405180910390a1505050565b5f61155e612270565b85516020968701206040805130818a015273ffffffffffffffffffffffffffffffffffffffff9a8b1681830152989099166060890152608088015260a08701949094525060c085019190915260e08085019190915284518085039091018152610100840185528051908301207f19010000000000000000000000000000000000000000000000000000000000006101208501526101228401919091526101428084019190915283518084039091018152610162909201909252805191012090565b60085473ffffffffffffffffffffffffffffffffffffffff161561166f576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61167a838383612acf565b611682612bf5565b5f555050600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055506001600755565b60606007546002036116f6576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026007558315806117085750838214155b15611749576040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604401610984565b5f61175333610c65565b90505f858067ffffffffffffffff811115611770576117706138d8565b604051908082528060200260200182016040528015611799578160200160208202803683370190505b5093505f8167ffffffffffffffff8111156117b6576117b66138d8565b6040519080825280602002602001820160405280156117df578160200160208202803683370190505b5090505f8267ffffffffffffffff8111156117fc576117fc6138d8565b604051908082528060200260200182016040528015611825578160200160208202803683370190505b5090505f3373ffffffffffffffffffffffffffffffffffffffff16632763b8da6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611872573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118969190614072565b90505f5b84811015611c23575f600d5f8e8e858181106118b8576118b8613e12565b602090810292909201358352508101919091526040015f20805490915073ffffffffffffffffffffffffffffffffffffffff1680611922576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83826005015414611962576040517f7fec71d700000000000000000000000000000000000000000000000000000000815260048101859052602401610984565b600182015473ffffffffffffffffffffffffffffffffffffffff1615611989575050611c1b565b81600401548584815181106119a0576119a0613e12565b6020026020010181815250508483815181106119be576119be613e12565b60200260200101518c8c858181106119d8576119d8613e12565b9050602002013511156119ec575050611c1b565b73ffffffffffffffffffffffffffffffffffffffff81163314611ae3578160030154421115611adc576040517f4225d37a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248301527f00000000000000000000000000000000000000000000000000000000000000001690634225d37a906044015f604051808303815f87803b158015611ac1575f5ffd5b505af1158015611ad3573d5f5f3e3d5ffd5b50505050611ae3565b5050611c1b565b6001820180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790556002820154865173ffffffffffffffffffffffffffffffffffffffff9190911690879085908110611b4257611b42613e12565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a5f878581518110611b9157611b91613e12565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190611be29061403b565b919050555060018a8481518110611bfb57611bfb613e12565b9115156020928302919091019091015287611c158161403b565b98505050505b60010161189a565b508415611e0b578460045f828254611c3b9190614184565b9091555050335f908152600b602052604081208054879290611c5e908490614197565b909155505073ffffffffffffffffffffffffffffffffffffffff86165f908152600c602052604081208054879290611c97908490614197565b90915550506040517f4225d37a000000000000000000000000000000000000000000000000000000008152336004820152602481018690527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634225d37a906044015f604051808303815f87803b158015611d27575f5ffd5b505af1158015611d39573d5f5f3e3d5ffd5b5050505f8281526010602052604090205473ffffffffffffffffffffffffffffffffffffffff16905080611d99576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166379e4afe833868b8e8e896040518763ffffffff1660e01b8152600401611ddc969594939291906141aa565b5f604051808303815f87803b158015611df3575f5ffd5b505af1158015611e05573d5f5f3e3d5ffd5b50505050505b82604051611e199190614255565b60405180910390203373ffffffffffffffffffffffffffffffffffffffff167f894bb814a80f77e14febccf552394d95b38cc21a6dda1b0cf26434433fdf3e4c878e8e8c604051611e6d94939291906142a0565b60405180910390a3505060016007555092979650505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff163314611efc576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610984565b73ffffffffffffffffffffffffffffffffffffffff8116611f49576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b905f90a250565b6060600754600203611ff5576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260075561200988888888888888612cf3565b600160075598975050505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff16331461208d576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610984565b8281146120d0576040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610984565b5f5b8381101561223a578484828181106120ec576120ec613e12565b905060200201355f5f1b0361212d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83838381811061214057612140613e12565b905060200201602081019061215591906137ac565b73ffffffffffffffffffffffffffffffffffffffff16036121a2576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8282828181106121b4576121b4613e12565b90506020020160208101906121c991906137ac565b60105f8787858181106121de576121de613e12565b9050602002013581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060010190506120d2565b507fa9759667b17e564f26a0d91ce1c5e4a1dc3910aee992dc3f5f4da0a59d48f3cb84848484604051610b3094939291906142d6565b5f7f000000000000000000000000000000000000000000000000000000000000000046146122a5576122a0612bf5565b905090565b505f5490565b5f6007546002036122e8576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026007556040805160018082528183019092525f91816020015b60608152602001906001900390816123035750506040805160018082528183019092529192505f91906020808301908036833701905050905089825f8151811061234f5761234f613e12565b6020026020010181905250612369828a8a8a8a8a8a612cf3565b9050805f8151811061237d5761237d613e12565b6020026020010151925060016007819055505050979650505050505050565b5f6123a633610c65565b9050835f8167ffffffffffffffff8111156123c3576123c36138d8565b6040519080825280602002602001820160405280156123ec578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff8a165f908152601160205260408120549192505b838110156127b85788888281811061243057612430613e12565b905060200281019061244291906142fc565b61244c9080614338565b90505f03612486576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61250f338c8b8b8581811061249d5761249d613e12565b90506020028101906124af91906142fc565b6124b99080614338565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508d92508c915087905081811061250157612501613e12565b905060200201358e87611555565b83828151811061252157612521613e12565b6020026020010181815250506125b68b84838151811061254357612543613e12565b60200260200101518b8b8581811061255d5761255d613e12565b905060200281019061256f91906142fc565b61257d906020810190614338565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061346392505050565b5f600d5f8584815181106125cc576125cc613e12565b60209081029190910181015182528101919091526040015f20805490915073ffffffffffffffffffffffffffffffffffffffff16156126545783828151811061261757612617613e12565b60200260200101516040517fec0db69800000000000000000000000000000000000000000000000000000000815260040161098491815260200190565b8054337fffffffffffffffffffffffff0000000000000000000000000000000000000000918216811783556001830180548316909117905560028201805490911673ffffffffffffffffffffffffffffffffffffffff8e161790558787838181106126c1576126c1613e12565b6020029190910135600483015550600581018b9055826126e08161403b565b9350508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb0d013658abb05dd269ff3ab257175d5ae3fa4107d4e142abd96e947cd5cb06f86858151811061274457612744613e12565b60200260200101518b8b8781811061275e5761275e613e12565b905060200201358e8e8881811061277757612777613e12565b905060200281019061278991906142fc565b612797906040810190614338565b6040516127a79493929190614399565b60405180910390a350600101612416565b5073ffffffffffffffffffffffffffffffffffffffff8a165f9081526011602090815260408083208490556009909152812080548592906127fa908490614197565b909155505073ffffffffffffffffffffffffffffffffffffffff8a165f908152600a602052604081208054859290612833908490614197565b9091555050335f908152600b602052604081208054859290612856908490614197565b909155505073ffffffffffffffffffffffffffffffffffffffff84165f908152600c60205260408120805485929061288f908490614197565b925050819055508260055f8282546128a79190614197565b90915550506040517f55e7d04400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152336024830152604482018590527f000000000000000000000000000000000000000000000000000000000000000016906355e7d044906064015f604051808303815f87803b15801561293f575f5ffd5b505af1158015612951573d5f5f3e3d5ffd5b50506040517f4225d37a000000000000000000000000000000000000000000000000000000008152336004820152602481018690527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169250634225d37a91506044015f604051808303815f87803b1580156129e0575f5ffd5b505af11580156129f2573d5f5f3e3d5ffd5b50506040517f9680b60300000000000000000000000000000000000000000000000000000000815260048101869052339250639680b60391506024015f604051808303815f87803b158015612a45575f5ffd5b505af1158015612a57573d5f5f3e3d5ffd5b505050508973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff980d83e9456535b0f9f3634d171df2a5f052f5d5e706b75d30c4e0433da927d845185604051612abb9291906143c2565b60405180910390a350505050505050505050565b811580612ada575080155b15612b11576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710831115612b58576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526127106024820152604401610984565b80821115612b9c576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610984565b63ffffffff811115612be7576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810182905263ffffffff6024820152604401610984565b600192909255600255600355565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ff376b6313a0837eb351511248cfe7dcc1cd26c49b8e0a47e1eb369dd62c425db6040518060400160405280600581526020017f312e312e30000000000000000000000000000000000000000000000000000000815250604051602001612c7e9190613e00565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b606063ffffffff612d044286614197565b1115612d5457612d144285614197565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019190915263ffffffff6024820152604401610984565b600254841080612d65575060035484115b15612db2576002546003546040517feb373cfe0000000000000000000000000000000000000000000000000000000081526004810187905260248101929092526044820152606401610984565b861580612dbd575085155b15612df4576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87515f819003612e30576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e3986610c65565b508067ffffffffffffffff811115612e5357612e536138d8565b604051908082528060200260200182016040528015612e7c578160200160208202803683370190505b5091505f8673ffffffffffffffffffffffffffffffffffffffff16632cc0fcb26040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ec9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eed9190614072565b905088811115612f33576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052602481018a9052604401610984565b8673ffffffffffffffffffffffffffffffffffffffff16632763b8da6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f7c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fa09190614072565b8814612fdb576040517f7fec71d700000000000000000000000000000000000000000000000000000000815260048101899052602401610984565b335f90815260116020526040812054905b8b5181101561318e578b818151811061300757613007613e12565b6020026020010151515f03613048576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61306f89338e848151811061305f5761305f613e12565b6020026020010151868e87611555565b85828151811061308157613081613e12565b6020026020010181815250505f600d5f8784815181106130a3576130a3613e12565b60209081029190910181015182528101919091526040015f20805490915073ffffffffffffffffffffffffffffffffffffffff16156130ee5785828151811061261757612617613e12565b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8b16178155613136428a614197565b60038201556002810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905560048101849055600581018b90558261317f8161403b565b93505050806001019050612fec565b50335f9081526011602090815260408083208490558b8352601090915290205473ffffffffffffffffffffffffffffffffffffffff16806131fb576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f38603a3900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216906338603a39903490613257903390899089908e908e906004016143e2565b5f604051808303818588803b15801561326e575f5ffd5b505af1158015613280573d5f5f3e3d5ffd5b50506040517f55e7d04400000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8d81166024830152604482018990527f00000000000000000000000000000000000000000000000000000000000000001693506355e7d044925060640190505f604051808303815f87803b158015613319575f5ffd5b505af115801561332b573d5f5f3e3d5ffd5b5050335f908152600960205260408120805488945090925061334e908490614197565b925050819055508360045f8282546133669190614197565b925050819055508360055f82825461337e9190614197565b925050819055508873ffffffffffffffffffffffffffffffffffffffff1663be2641de868e6040518363ffffffff1660e01b81526004016133c092919061441d565b5f604051808303815f87803b1580156133d7575f5ffd5b505af11580156133e9573d5f5f3e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f5d60556939d4ab71b3129033c865bf7e828306916fd94fd35019d3d530eb36b3868860405161344c9291906143c2565b60405180910390a350505050979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff83166134b0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83163b156135c6576040517f1626ba7e000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff851690631626ba7e9061352390869086906004016144b0565b602060405180830381865afa15801561353e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061356291906144c8565b7fffffffff00000000000000000000000000000000000000000000000000000000160361358e57505050565b8282826040517f02d51bb200000000000000000000000000000000000000000000000000000000815260040161098493929190613fd1565b80516041146136085780516040517f1d9f5a5f000000000000000000000000000000000000000000000000000000008152610984918391604190600401614507565b5f8160408151811061361c5761361c613e12565b016020015160f81c9050600481101561363d5761363a601b8261452b565b90505b602082015160408301517f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08111156136a7578585856040517f02d51bb200000000000000000000000000000000000000000000000000000000815260040161098493929190613fd1565b604080515f8082526020820180845288905260ff861692820192909252606081018490526080810183905260019060a0016020604051602081039080840390855afa1580156136f8573d5f5f3e3d5ffd5b5050506020604051035190508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461376f578686866040517f02d51bb200000000000000000000000000000000000000000000000000000000815260040161098493929190613fd1565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114613799575f5ffd5b50565b80356137a781613778565b919050565b5f602082840312156137bc575f5ffd5b81356137c781613778565b9392505050565b5f5f83601f8401126137de575f5ffd5b50813567ffffffffffffffff8111156137f5575f5ffd5b6020830191508360208260051b850101111561380f575f5ffd5b9250929050565b5f5f5f5f60408587031215613829575f5ffd5b843567ffffffffffffffff81111561383f575f5ffd5b61384b878288016137ce565b909550935050602085013567ffffffffffffffff81111561386a575f5ffd5b613876878288016137ce565b95989497509550505050565b5f60208284031215613892575f5ffd5b5035919050565b60208101600483106138d2577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561394c5761394c6138d8565b604052919050565b5f82601f830112613963575f5ffd5b813567ffffffffffffffff81111561397d5761397d6138d8565b6139ae60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613905565b8181528460208386010111156139c2575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f606084860312156139f0575f5ffd5b833592506020840135613a0281613778565b9150604084013567ffffffffffffffff811115613a1d575f5ffd5b613a2986828701613954565b9150509250925092565b5f5f83601f840112613a43575f5ffd5b50813567ffffffffffffffff811115613a5a575f5ffd5b60208301915083602082850101111561380f575f5ffd5b5f5f5f5f5f5f5f6080888a031215613a87575f5ffd5b8735613a9281613778565b9650602088013567ffffffffffffffff811115613aad575f5ffd5b613ab98a828b016137ce565b909750955050604088013567ffffffffffffffff811115613ad8575f5ffd5b613ae48a828b016137ce565b909550935050606088013567ffffffffffffffff811115613b03575f5ffd5b613b0f8a828b01613a33565b989b979a50959850939692959293505050565b5f5f5f60608486031215613b34575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f5f5f5f60c08789031215613b60575f5ffd5b8635613b6b81613778565b95506020870135613b7b81613778565b9450604087013567ffffffffffffffff811115613b96575f5ffd5b613ba289828a01613954565b969995985095966060810135965060808101359560a090910135945092505050565b5f8151808452602084019350602083015f5b82811015613bf65781511515865260209586019590910190600101613bd6565b5093949350505050565b602081525f6137c76020830184613bc4565b5f5f5f5f5f5f5f60c0888a031215613c28575f5ffd5b873567ffffffffffffffff811115613c3e575f5ffd5b8801601f81018a13613c4e575f5ffd5b803567ffffffffffffffff811115613c6857613c686138d8565b8060051b613c7860208201613905565b9182526020818401810192908101908d841115613c93575f5ffd5b6020850192505b83831015613cd957823567ffffffffffffffff811115613cb8575f5ffd5b613cc78f602083890101613954565b83525060209283019290910190613c9a565b9a50505050602089013596505060408801359450613cf96060890161379c565b93506080880135925060a088013567ffffffffffffffff811115613b03575f5ffd5b5f8151808452602084019350602083015f5b82811015613bf6578151865260209586019590910190600101613d2d565b602081525f6137c76020830184613d1b565b5f5f5f5f5f5f5f60c0888a031215613d73575f5ffd5b873567ffffffffffffffff811115613d89575f5ffd5b613d958a828b01613954565b97505060208801359550604088013594506060880135613cf981613778565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6137c76020830184613db4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b803580151581146137a7575f5ffd5b5f60208284031215613e5e575f5ffd5b6137c782613e3f565b8183526020830192505f815f5b84811015613bf6578135613e8781613778565b73ffffffffffffffffffffffffffffffffffffffff1686526020958601959190910190600101613e74565b604081525f613ec5604083018688613e67565b8281036020808501919091528482528591015f5b85811015613f0057613eea83613e3f565b1515825260209283019290910190600101613ed9565b50979650505050505050565b5f60208284031215613f1c575f5ffd5b81516137c781613778565b805163ffffffff811681146137a7575f5ffd5b5f5f5f5f5f5f5f60e0888a031215613f50575f5ffd5b87516bffffffffffffffffffffffff81168114613f6b575f5ffd5b6020890151909750613f7c81613778565b60408901519096509450613f9260608901613f27565b9350613fa060808901613f27565b9250613fae60a08901613f27565b915060c088015160068110613fc1575f5ffd5b8091505092959891949750929550565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6140056060830184613db4565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361406b5761406b61400e565b5060010190565b5f60208284031215614082575f5ffd5b5051919050565b8183525f7f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156140b9575f5ffd5b8260051b80836020870137939093016020019392505050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff86166020820152608060408201525f614164608083018688614089565b82810360608401526141778185876140d2565b9998505050505050505050565b81810381811115610d9557610d9561400e565b80820180821115610d9557610d9561400e565b5f60a0820173ffffffffffffffffffffffffffffffffffffffff8916835260a0602084015280885180835260c08501915060208a0192505f5b8181101561421757835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016141e3565b5050838103604085015261422b8189613bc4565b9150508281036060840152614241818688614089565b905082810360808401526141778185613d1b565b81515f90829060208501835b8281101561429557815173ffffffffffffffffffffffffffffffffffffffff16845260209384019390910190600101614261565b509195945050505050565b848152606060208201525f6142b9606083018587614089565b82810360408401526142cb8185613bc4565b979650505050505050565b604081525f6142e9604083018688614089565b82810360208401526142cb818587613e67565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261432e575f5ffd5b9190910192915050565b5f5f83357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261436b575f5ffd5b83018035915067ffffffffffffffff821115614385575f5ffd5b60200191503681900382131561380f575f5ffd5b848152836020820152606060408201525f6143b86060830184866140d2565b9695505050505050565b828152604060208201525f6143da6040830184613d1b565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff86168152846020820152836040820152608060608201525f6142cb6080830184866140d2565b604081525f61442f6040830185613d1b565b828103602084015280845180835260208301915060208160051b840101602087015f5b838110156144a2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086840301855261448c838351613db4565b6020958601959093509190910190600101614452565b509098975050505050505050565b828152604060208201525f6143da6040830184613db4565b5f602082840312156144d8575f5ffd5b81517fffffffff00000000000000000000000000000000000000000000000000000000811681146137c7575f5ffd5b606081525f6145196060830186613db4565b60208301949094525060400152919050565b60ff8181168382160190811115610d9557610d9561400e56fea26469706673582212205361abf960db68d3b3bae8075574e1aeeffc915036bea9a2bf06b78902652cc364736f6c634300081c0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/valory/contracts/mech_marketplace/contract.py b/packages/valory/contracts/mech_marketplace/contract.py new file mode 100644 index 0000000000..c41a25f861 --- /dev/null +++ b/packages/valory/contracts/mech_marketplace/contract.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2026 Valory AG +# +# 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. +# +# ------------------------------------------------------------------------------ + +"""Wrapper for the MechMarketplace contract, used by the off-chain dispatch path.""" + +from typing import cast + +from aea.common import JSONLike +from aea.configurations.base import PublicId +from aea.contracts.base import Contract +from aea.crypto.base import LedgerApi +from aea_ledger_ethereum import EthereumApi + +PUBLIC_ID = PublicId.from_str("valory/mech_marketplace:0.1.0") + + +class MechMarketplace(Contract): + """Read-only wrapper for the MechMarketplace marketplace contract. + + The off-chain request behaviour reads ``mapNonces`` and ``chainId`` + here before signing each attempt: the locally-derived ``request_id`` + must match what the contract will compute at settlement, and the + EIP-712 domain separator binds to the marketplace's immutable chain id. + The contract is not written to from this wrapper; settlement still goes + through the existing on-chain submission paths. + """ + + contract_id = PUBLIC_ID + + @classmethod + def get_nonce( + cls, + ledger_api: LedgerApi, + contract_address: str, + sender: str, + ) -> JSONLike: + """Read ``mapNonces(sender)`` on the marketplace. + + The off-chain request behaviour reads this before signing each + attempt so the locally-derived ``request_id`` matches the value the + contract will compute at settlement. The slot is bumped at + ``deliverMarketplaceWithSignatures`` time, not at request time, so + the same nonce is reused across the deposit-then-retry round-trip. + + :param ledger_api: the ledger API object. + :param contract_address: the marketplace contract address. + :param sender: the requester address (the Safe / EOA owning the + prepaid balance) whose nonce slot to read. + :return: a ``{"nonce": int}`` dict matching the framework's + ``GET_STATE`` response shape. + """ + ledger_api = cast(EthereumApi, ledger_api) + contract_address = ledger_api.api.to_checksum_address(contract_address) + sender = ledger_api.api.to_checksum_address(sender) + contract_instance = cls.get_instance(ledger_api, contract_address) + nonce = contract_instance.functions.mapNonces(sender).call() + return dict(nonce=int(nonce)) + + @classmethod + def get_chain_id( + cls, + ledger_api: LedgerApi, + contract_address: str, + ) -> JSONLike: + """Read the immutable ``chainId`` constant baked into the marketplace. + + Used to assemble the EIP-712 domain separator client-side when + deriving ``request_id`` so the hash binds to the same chain the + contract validates against at settlement. + + :param ledger_api: the ledger API object. + :param contract_address: the marketplace contract address. + :return: a ``{"chain_id": int}`` dict matching the framework's + ``GET_STATE`` response shape. + """ + ledger_api = cast(EthereumApi, ledger_api) + contract_address = ledger_api.api.to_checksum_address(contract_address) + contract_instance = cls.get_instance(ledger_api, contract_address) + chain_id = contract_instance.functions.chainId().call() + return dict(chain_id=int(chain_id)) + + @classmethod + def get_balance_tracker( + cls, + ledger_api: LedgerApi, + contract_address: str, + payment_type: bytes, + ) -> JSONLike: + """Read ``mapPaymentTypeBalanceTrackers(paymentType)`` on the marketplace. + + The off-chain request behaviour uses this to validate that the + ``payTo`` address advertised in a structured 402 body actually + matches the canonical BalanceTracker the marketplace registered + for the mech's ``paymentType``. Without this check a malicious or + compromised mech could redirect the auto-deposit (capped per cycle + but recurring) to an attacker-controlled address. The result is + the on-chain truth; settlement still goes through the existing + on-chain submission paths. + + :param ledger_api: the ledger API object. + :param contract_address: the marketplace contract address. + :param payment_type: the 32-byte ``paymentType`` selector read off + the mech (matches the ``paymentType`` constant the marketplace + uses to key its tracker registry). + :return: a ``{"balance_tracker": "0x…"}`` dict matching the + framework's ``GET_STATE`` response shape. ``0x0…0`` means the + marketplace has no tracker registered for this paymentType. + """ + ledger_api = cast(EthereumApi, ledger_api) + contract_address = ledger_api.api.to_checksum_address(contract_address) + contract_instance = cls.get_instance(ledger_api, contract_address) + tracker = contract_instance.functions.mapPaymentTypeBalanceTrackers( + payment_type + ).call() + return dict(balance_tracker=str(tracker)) diff --git a/packages/valory/contracts/mech_marketplace/contract.yaml b/packages/valory/contracts/mech_marketplace/contract.yaml new file mode 100644 index 0000000000..272fd495b5 --- /dev/null +++ b/packages/valory/contracts/mech_marketplace/contract.yaml @@ -0,0 +1,21 @@ +name: mech_marketplace +author: valory +version: 0.1.0 +type: contract +description: MechMarketplace contract, read-only client wrapper exposing the marketplace + state the off-chain dispatch path needs (nonces, chain id). +license: Apache-2.0 +aea_version: '>=2.0.0, <3.0.0' +fingerprint: + README.md: bafybeih5pzhyqwgqp6pl4tczjtqcwc5ljg7n5wjxafdo7bv5gozkog4zge + __init__.py: bafybeiekag5mesqv7a4dwbn2ztcb33peoqaj5cljsgusw7aajizx2wfqk4 + build/mech_marketplace.json: bafybeifgu3pmcigfshc3pk6bmuqjmjrk3lilpivwiox5h4g5xlfsclaf6a + contract.py: bafybeie237kayoqdgq3yccvacgcr6l2uchmwkepwszggjfchh5l7yrgw5y +fingerprint_ignore_patterns: [] +contracts: [] +class_name: MechMarketplace +contract_interface_paths: + ethereum: build/mech_marketplace.json +dependencies: + open-aea-ledger-ethereum: + version: ==2.2.7 diff --git a/packages/valory/skills/check_stop_trading_abci/skill.yaml b/packages/valory/skills/check_stop_trading_abci/skill.yaml index d8851edd12..1893c9c9ab 100644 --- a/packages/valory/skills/check_stop_trading_abci/skill.yaml +++ b/packages/valory/skills/check_stop_trading_abci/skill.yaml @@ -31,7 +31,7 @@ protocols: [] skills: - valory/abstract_round_abci:0.1.0:bafybeicioxhbhnsoqyqvkeevd7df7r2vubbiglyf7ucps2el73objazjsq - valory/chatui_abci:0.1.0:bafybeie2kmgihgk3rwpzelaa76ypvchsyg2vy3me4vxlbjttaq4frs3ipa -- valory/mech_interact_abci:0.1.0:bafybeidnmszufszq3ro4ebgrqzmhqgctrsc6sykeanfsbvotghvt2cgfsy +- valory/mech_interact_abci:0.1.0:bafybeihhwzpa6x5ypth426tzd2zjsnys6jmjaab4zvk4edisetzktft754 - valory/staking_abci:0.1.0:bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq behaviours: main: diff --git a/packages/valory/skills/decision_maker_abci/behaviours/handle_failed_tx.py b/packages/valory/skills/decision_maker_abci/behaviours/handle_failed_tx.py index 900162e5ae..ceaec31f38 100644 --- a/packages/valory/skills/decision_maker_abci/behaviours/handle_failed_tx.py +++ b/packages/valory/skills/decision_maker_abci/behaviours/handle_failed_tx.py @@ -34,7 +34,10 @@ from packages.valory.skills.decision_maker_abci.states.sell_outcome_tokens import ( SellOutcomeTokensRound, ) -from packages.valory.skills.mech_interact_abci.states.request import MechRequestRound +from packages.valory.skills.mech_interact_abci.states.request import ( + MechRequestRound, + OFFCHAIN_DEPOSIT_TX_SUBMITTER, +) class HandleFailedTxBehaviour(DecisionMakerBaseBehaviour): @@ -47,7 +50,16 @@ def async_act(self) -> Generator: with self.context.benchmark_tool.measure(self.behaviour_id).local(): tx_submitter = self.synchronized_data.tx_submitter - mech_timed_out = tx_submitter == MechRequestRound.auto_round_id() + # An off-chain mech cycle exhausts its failover budget after + # the deposit has settled (sentinel set by the executor); a + # cycle that fails before any deposit carries the + # MechRequestRound id. Treat both as a mech timeout so the + # tool-quarantine / retry bookkeeping fires identically to + # the on-chain mech-timeout path. + mech_timed_out = tx_submitter in ( + MechRequestRound.auto_round_id(), + OFFCHAIN_DEPOSIT_TX_SUBMITTER, + ) self.shared_state.mech_timed_out = mech_timed_out after_bet_attempt = mech_timed_out or tx_submitter in ( BetPlacementRound.auto_round_id(), diff --git a/packages/valory/skills/decision_maker_abci/skill.yaml b/packages/valory/skills/decision_maker_abci/skill.yaml index 1bec52d111..816625ee60 100644 --- a/packages/valory/skills/decision_maker_abci/skill.yaml +++ b/packages/valory/skills/decision_maker_abci/skill.yaml @@ -18,7 +18,7 @@ fingerprint: behaviours/check_benchmarking.py: bafybeiao2lyj7apezkqrpgsyzb3dwvrdgsrgtprf6iuhsmlsufvxfl5bci behaviours/decision_receive.py: bafybeicrm4xzmws55pvvfbtijaeu53vsh4zy3sqfupugne7ononrkmmaym behaviours/decision_request.py: bafybeicqygaiieqnjgawlrm7qo65sgncpuujw2zolmgvjjupnchtoua35q - behaviours/handle_failed_tx.py: bafybeib7yjysksnc7azr3okvskb62svlyj2qt2t4tsiaiosi3dumdrm6d4 + behaviours/handle_failed_tx.py: bafybeige4bzbsxiqd6jhvo523k3ml7aozjr6verr4qyexk7czxqbmuipge behaviours/omen_withdraw.py: bafybeibu5dypwmcyitkrpqctkkomlxsvuqkzqvfi6yout5ja2kihu4deie behaviours/omen_withdrawal_store.py: bafybeifn2hclvfvoqmpexize4iam4ue4vq7pozxahwf44tagsrukp2atly behaviours/polymarket_bet_placement.py: bafybeibw6ywbr6xjjvhzs5kscqpwu3tznez4qdl6hvtffqb4vsswtg6i3m @@ -178,7 +178,7 @@ skills: - valory/abstract_round_abci:0.1.0:bafybeicioxhbhnsoqyqvkeevd7df7r2vubbiglyf7ucps2el73objazjsq - valory/market_manager_abci:0.1.0:bafybeic67hypwetzltnuy3a6y3o2o332lxyvn34buq57gy4n6bfqpbpxjm - valory/transaction_settlement_abci:0.1.0:bafybeibv3tycpdhphlblu62zpcbjsj7hnwkutexxqagorkelhjlt4t4fii -- valory/mech_interact_abci:0.1.0:bafybeidnmszufszq3ro4ebgrqzmhqgctrsc6sykeanfsbvotghvt2cgfsy +- valory/mech_interact_abci:0.1.0:bafybeihhwzpa6x5ypth426tzd2zjsnys6jmjaab4zvk4edisetzktft754 - valory/staking_abci:0.1.0:bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq - valory/agent_performance_summary_abci:0.1.0:bafybeigmmvpncem6i6t57nwjqzajrbnf6rnqgp43mlo6jf6uziq6lrhlca - valory/chatui_abci:0.1.0:bafybeie2kmgihgk3rwpzelaa76ypvchsyg2vy3me4vxlbjttaq4frs3ipa diff --git a/packages/valory/skills/trader_abci/composition.py b/packages/valory/skills/trader_abci/composition.py index 0a38e30388..dd95aa0fc5 100644 --- a/packages/valory/skills/trader_abci/composition.py +++ b/packages/valory/skills/trader_abci/composition.py @@ -113,6 +113,7 @@ from packages.valory.skills.mech_interact_abci.rounds import MechInteractAbciApp from packages.valory.skills.mech_interact_abci.states.final_states import ( FailedMechInformationRound, + FailedOffchainMechRequestRound, FinishedMarketplaceLegacyDetectedRound, FinishedMechInformationRound, FinishedMechLegacyDetectedRound, @@ -121,6 +122,8 @@ FinishedMechRequestSkipRound, FinishedMechResponseRound, FinishedMechResponseTimeoutRound, + FinishedOffchainMechDepositNeededRound, + FinishedOffchainMechRequestRound, ) from packages.valory.skills.mech_interact_abci.states.mech_version import ( MechVersionDetectionRound, @@ -160,6 +163,7 @@ ChecksPassedRound, FinishedBetPlacementTxRound, FinishedMechRequestTxRound, + FinishedOffchainMechDepositSettledRound, FinishedOmenWithdrawTxRound, FinishedPolymarketSwapTxRound, FinishedPolymarketTopUpTxRound, @@ -213,6 +217,16 @@ # period are picked up by the next cycle's early redeem. FinishedMechRequestSkipRound: CallCheckpointRound, FinishedPolymarketBetPlacementRound: CallCheckpointRound, + # Off-chain mech_interact_abci edges. Happy path skips on-chain tx + # settlement and polls HTTP. Deposit-needed settles via the + # PreTxSettlementRound gate; the off-chain ``tx_submitter`` sentinel + # routes the settled deposit back into MechRequestRound where + # ``_retry_pending`` re-POSTs the cached request. Failure mirrors + # the on-chain mech timeout recovery wiring. + FinishedOffchainMechRequestRound: MechResponseRound, + FinishedOffchainMechDepositNeededRound: PreTxSettlementRound, + FinishedOffchainMechDepositSettledRound: MechRequestRound, + FailedOffchainMechRequestRound: HandleFailedTxRound, # Omen on-chain bet placement and sell-outcome-tokens go through # `PostBetUpdateRound` first, which runs the local-state bookkeeping # (advancing the bet's queue status, processed timestamp, invested diff --git a/packages/valory/skills/trader_abci/fsm_specification.yaml b/packages/valory/skills/trader_abci/fsm_specification.yaml index 8dda20f0a1..0f30b05a1a 100644 --- a/packages/valory/skills/trader_abci/fsm_specification.yaml +++ b/packages/valory/skills/trader_abci/fsm_specification.yaml @@ -36,6 +36,10 @@ alphabet_in: - NO_MARKETPLACE - NO_OP - NO_REDEEMING +- OFFCHAIN_ALL_FAILED +- OFFCHAIN_DEPOSIT_NEEDED +- OFFCHAIN_DONE +- OFFCHAIN_MECH_DEPOSIT_SETTLED - POLYMARKET_DONE - POLYMARKET_FETCH_MARKETS - PREPARE_TX @@ -44,6 +48,7 @@ alphabet_in: - REFILL_REQUIRED - RESET_AND_PAUSE_TIMEOUT - RESET_TIMEOUT +- RESPONSE_ROUND_TIMEOUT - REVIEW_BETS - ROUND_TIMEOUT - SELL_OUTCOME_TOKENS_DONE @@ -239,11 +244,14 @@ transition_func: (MechRequestRound, BUY_SUBSCRIPTION): MechPurchaseSubscriptionRound (MechRequestRound, DONE): PreTxSettlementRound (MechRequestRound, NO_MAJORITY): MechRequestRound + (MechRequestRound, OFFCHAIN_ALL_FAILED): HandleFailedTxRound + (MechRequestRound, OFFCHAIN_DEPOSIT_NEEDED): PreTxSettlementRound + (MechRequestRound, OFFCHAIN_DONE): MechResponseRound (MechRequestRound, ROUND_TIMEOUT): MechRequestRound (MechRequestRound, SKIP_REQUEST): CallCheckpointRound (MechResponseRound, DONE): DecisionReceiveRound (MechResponseRound, NO_MAJORITY): MechResponseRound - (MechResponseRound, ROUND_TIMEOUT): HandleFailedTxRound + (MechResponseRound, RESPONSE_ROUND_TIMEOUT): HandleFailedTxRound (MechVersionDetectionRound, NO_MAJORITY): MechVersionDetectionRound (MechVersionDetectionRound, NO_MARKETPLACE): CheckBenchmarkingModeRound (MechVersionDetectionRound, ROUND_TIMEOUT): MechVersionDetectionRound @@ -329,6 +337,7 @@ transition_func: (PostOmenWithdrawRound, WITHDRAWAL_ROUND_TIMEOUT): ResetAndPauseRound (PostTxSettlementRound, BET_PLACEMENT_DONE): PostBetUpdateRound (PostTxSettlementRound, MECH_REQUESTING_DONE): MechResponseRound + (PostTxSettlementRound, OFFCHAIN_MECH_DEPOSIT_SETTLED): MechRequestRound (PostTxSettlementRound, REDEEMING_DONE): CheckStopTradingRound (PostTxSettlementRound, ROUND_TIMEOUT): PostTxSettlementRound (PostTxSettlementRound, SELL_OUTCOME_TOKENS_DONE): PostBetUpdateRound diff --git a/packages/valory/skills/trader_abci/skill.yaml b/packages/valory/skills/trader_abci/skill.yaml index 61b39f28ba..c6e901b572 100644 --- a/packages/valory/skills/trader_abci/skill.yaml +++ b/packages/valory/skills/trader_abci/skill.yaml @@ -9,15 +9,15 @@ fingerprint: README.md: bafybeiab4xgadptz4mhvno4p6xvkh7p4peg7iuhotabydriu74dmj6ljga __init__.py: bafybeidp3c6ychle2a6gvrzznmgvkgtzkcxras42gmq3kfey4xwmxa3rom behaviours.py: bafybeigz7mlskyhiusv7rhon7dalzyx7w5yd64nyyjy4bmz2mju72nm7jy - composition.py: bafybeidrwf2tq7476cna5trjcf3vfmrt23o3uyrwwykdbhkbypuewyss7y + composition.py: bafybeifelwc7ugcvtffbnqkbtxpicgbvh7ih3hu4y7e5kju5uxj4ncmave dialogues.py: bafybeifoywfxhnowfy2ofkltizyhuiuv3tgqakwjzm7vj4y4gb2ozhjpey - fsm_specification.yaml: bafybeiantftkkh4q5kfsdpuv45eg7o4tcmmhvnjhdvnlkwklsoavamizdy + fsm_specification.yaml: bafybeiggomdym42wp47n3qjt6eqmewrm26t5y6aqapg5noafpqbamituhy handlers.py: bafybeidefu2bxiadnxbnlaiz2e4ntrcrraxhrvmvyd7uce3e274lfdodti models.py: bafybeiai3vxuyl2ydfxocaygnhbno2ef3lw4ag63turmd7fqpaleixc2xy tests/__init__.py: bafybeiadatapyjh3e7ucg2ehz77oms3ihrbutwb2cs2tkjehy54utwvuyi tests/test_agent_config_resolution.py: bafybeiflcotz6gq2dgtnzptlyyhu5fryg3c6z7gosoqmln2tlci3v4odqa tests/test_behaviours.py: bafybeicovtjruufnh2yd5lhfvc6pgcletuyj2s3jaz5sz55wsdo2w22xle - tests/test_composition.py: bafybeie54kpq3hzxnqegeyswbg7upae3bi25p7xucaco36zzkekt7ivleq + tests/test_composition.py: bafybeig36t6xlip4xyylis3n7t6wx45zftfpfk75fztlz3fgycrd3ad7na tests/test_dialogues.py: bafybeibatogwoj6ieapcbiwonij6vskhogc65vfv53tyauqzeyiwmnd2im tests/test_handlers.py: bafybeiewoqdpdnjvjirx2vpwt5u5m4qwba4easgivgsikqk7tbcp2abisq tests/test_models.py: bafybeianja6z3rspswf4cag3pnq2hgtsbc3hq7ndggyr2p3q6ye34wnoqq @@ -57,11 +57,11 @@ skills: - valory/transaction_settlement_abci:0.1.0:bafybeibv3tycpdhphlblu62zpcbjsj7hnwkutexxqagorkelhjlt4t4fii - valory/termination_abci:0.1.0:bafybeibnnzry5kknci3z46gcjgutv4jid3ir6xn6a5adq3tx6v2e25augq - valory/market_manager_abci:0.1.0:bafybeic67hypwetzltnuy3a6y3o2o332lxyvn34buq57gy4n6bfqpbpxjm -- valory/decision_maker_abci:0.1.0:bafybeigterfcylnzjzxpja6u56gvcq2grcgvia2qcj34yr2ksogss33wuu -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeiglvalfzo744cvxvslx4vo42r4tcozn7hzsn3aa2q3hkm77t77xwe +- valory/decision_maker_abci:0.1.0:bafybeiewwbtf3w5zzs2u22vudkjz5u2xnmvgx7hygo3bmjgn6q32ae6vne +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeiboec4uzlj2yd5oxyg2feh6j26uez55g2d6fxs3xizltchdsqhk5i - valory/staking_abci:0.1.0:bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq -- valory/check_stop_trading_abci:0.1.0:bafybeifbiko6p3sqqg2q6qemmcig432s5djcsxm44j35ejittlpyr5f6z4 -- valory/mech_interact_abci:0.1.0:bafybeidnmszufszq3ro4ebgrqzmhqgctrsc6sykeanfsbvotghvt2cgfsy +- valory/check_stop_trading_abci:0.1.0:bafybeiexmdtj3qfjnhh2sy3fa4hwxkvqogsy7u46liobzhgilzogeoezeu +- valory/mech_interact_abci:0.1.0:bafybeihhwzpa6x5ypth426tzd2zjsnys6jmjaab4zvk4edisetzktft754 - valory/chatui_abci:0.1.0:bafybeie2kmgihgk3rwpzelaa76ypvchsyg2vy3me4vxlbjttaq4frs3ipa - valory/agent_performance_summary_abci:0.1.0:bafybeigmmvpncem6i6t57nwjqzajrbnf6rnqgp43mlo6jf6uziq6lrhlca - valory/funds_manager:0.1.0:bafybeibne4vkmbper3ryn7q6kt7lclbyylgorziscyn6msr5qt46aihv4m @@ -300,6 +300,14 @@ models: priority_mech_service_id: 0 requester_staking_instance_address: '0x0000000000000000000000000000000000000000' response_timeout: 300 + use_dynamic_mech_selection: false + use_offchain: false + offchain_url: null + offchain_deposit_target_calls: 10 + auto_deposit_cap_per_cycle: 5000000 + offchain_poll_interval_seconds: 3.0 + offchain_poll_timeout_seconds: 300.0 + offchain_failover_max_retries: 2 expected_mech_response_time: 300 mech_invalid_response: Invalid Response mech_consecutive_failures_threshold: 2 diff --git a/packages/valory/skills/trader_abci/tests/test_composition.py b/packages/valory/skills/trader_abci/tests/test_composition.py index d6ce02da0e..e33cdf2ff9 100644 --- a/packages/valory/skills/trader_abci/tests/test_composition.py +++ b/packages/valory/skills/trader_abci/tests/test_composition.py @@ -27,6 +27,9 @@ from packages.valory.skills.decision_maker_abci.states.final_states import ( FinishedPostBetUpdateRound, ) +from packages.valory.skills.decision_maker_abci.states.handle_failed_tx import ( + HandleFailedTxRound, +) from packages.valory.skills.decision_maker_abci.states.post_bet_update import ( PostBetUpdateRound, ) @@ -38,6 +41,13 @@ FinishedMarketManagerRound, FinishedPolymarketFetchMarketRound, ) +from packages.valory.skills.mech_interact_abci.states.final_states import ( + FailedOffchainMechRequestRound, + FinishedOffchainMechDepositNeededRound, + FinishedOffchainMechRequestRound, +) +from packages.valory.skills.mech_interact_abci.states.request import MechRequestRound +from packages.valory.skills.mech_interact_abci.states.response import MechResponseRound from packages.valory.skills.staking_abci.rounds import CallCheckpointRound from packages.valory.skills.termination_abci.rounds import ( BackgroundRound, @@ -51,12 +61,14 @@ ) from packages.valory.skills.tx_settlement_multiplexer_abci.rounds import ( FinishedBetPlacementTxRound, + FinishedOffchainMechDepositSettledRound, FinishedPolymarketWrapCollateralTxRound, FinishedRedeemingTxRound, FinishedSellOutcomeTokensTxRound, + PreTxSettlementRound, ) -EXPECTED_TRANSITION_MAPPING_LENGTH = 57 +EXPECTED_TRANSITION_MAPPING_LENGTH = 61 # Transitions introduced or rewired by the always-redeem-first / # `PostBetUpdateRound` FSM restructure (PR #904). Each pair must hold @@ -79,6 +91,34 @@ FinishedPostBetUpdateRound: CallCheckpointRound, } +# Off-chain mech-interact transitions. Pinned individually because a +# flat value-set assertion would let a silent swap pass — e.g. routing +# ``FinishedOffchainMechDepositSettledRound`` to ``MechResponseRound`` +# instead of ``MechRequestRound`` would break ``_retry_pending``, +# and routing ``FinishedOffchainMechDepositNeededRound`` to +# ``RandomnessTransactionSubmissionRound`` would skip the +# refill-required check that ``PreTxSettlementRound`` runs. +OFFCHAIN_TRANSITIONS = { + FinishedOffchainMechRequestRound: MechResponseRound, + FinishedOffchainMechDepositNeededRound: PreTxSettlementRound, + FinishedOffchainMechDepositSettledRound: MechRequestRound, + FailedOffchainMechRequestRound: HandleFailedTxRound, +} + + +@pytest.mark.parametrize( + "src,dst", + list(OFFCHAIN_TRANSITIONS.items()), + ids=lambda cls: getattr(cls, "__name__", str(cls)), +) +def test_offchain_transition(src: type, dst: type) -> None: + """Each off-chain mech-interact transition must resolve to its exact target round.""" + assert src in abci_app_transition_mapping, f"{src.__name__} missing from mapping" + assert abci_app_transition_mapping[src] is dst, ( + f"{src.__name__} -> {abci_app_transition_mapping[src].__name__}, " + f"expected {dst.__name__}" + ) + @pytest.mark.parametrize( "src,dst", diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/fsm_specification.yaml b/packages/valory/skills/tx_settlement_multiplexer_abci/fsm_specification.yaml index 56fd05fa17..c7c996f6f5 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/fsm_specification.yaml +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/fsm_specification.yaml @@ -3,6 +3,7 @@ alphabet_in: - CHECKS_PASSED - MECH_REQUESTING_DONE - NO_MAJORITY +- OFFCHAIN_MECH_DEPOSIT_SETTLED - REDEEMING_DONE - REFILL_REQUIRED - ROUND_TIMEOUT @@ -22,6 +23,7 @@ final_states: - FailedMultiplexerRound - FinishedBetPlacementTxRound - FinishedMechRequestTxRound +- FinishedOffchainMechDepositSettledRound - FinishedOmenWithdrawTxRound - FinishedPolymarketSwapTxRound - FinishedPolymarketTopUpTxRound @@ -41,6 +43,7 @@ states: - FailedMultiplexerRound - FinishedBetPlacementTxRound - FinishedMechRequestTxRound +- FinishedOffchainMechDepositSettledRound - FinishedOmenWithdrawTxRound - FinishedPolymarketSwapTxRound - FinishedPolymarketTopUpTxRound @@ -56,6 +59,7 @@ states: transition_func: (PostTxSettlementRound, BET_PLACEMENT_DONE): FinishedBetPlacementTxRound (PostTxSettlementRound, MECH_REQUESTING_DONE): FinishedMechRequestTxRound + (PostTxSettlementRound, OFFCHAIN_MECH_DEPOSIT_SETTLED): FinishedOffchainMechDepositSettledRound (PostTxSettlementRound, REDEEMING_DONE): FinishedRedeemingTxRound (PostTxSettlementRound, ROUND_TIMEOUT): PostTxSettlementRound (PostTxSettlementRound, SELL_OUTCOME_TOKENS_DONE): FinishedSellOutcomeTokensTxRound diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/rounds.py b/packages/valory/skills/tx_settlement_multiplexer_abci/rounds.py index ba08e0f215..306ddc2094 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/rounds.py +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/rounds.py @@ -67,7 +67,10 @@ from packages.valory.skills.mech_interact_abci.states.purchase_subscription import ( MechPurchaseSubscriptionRound, ) -from packages.valory.skills.mech_interact_abci.states.request import MechRequestRound +from packages.valory.skills.mech_interact_abci.states.request import ( + MechRequestRound, + OFFCHAIN_DEPOSIT_TX_SUBMITTER, +) from packages.valory.skills.staking_abci.rounds import CallCheckpointRound @@ -91,6 +94,7 @@ class Event(Enum): WITHDRAW_OMEN_DONE = "withdraw_omen_done" TOP_UP_DONE = "top_up_done" WITHDRAW_TOP_UP_DONE = "withdraw_top_up_done" + OFFCHAIN_MECH_DEPOSIT_SETTLED = "offchain_mech_deposit_settled" class PreTxSettlementRound(VotingRound): @@ -144,11 +148,27 @@ def end_block(self) -> Optional[Tuple[BaseSynchronizedData, Enum]]: PolymarketWrapCollateralRound.auto_round_id(): Event.WRAP_COLLATERAL_DONE, PolymarketTopUpRound.auto_round_id(): Event.TOP_UP_DONE, PolymarketWithdrawTopUpRound.auto_round_id(): Event.WITHDRAW_TOP_UP_DONE, + # Settled off-chain auto-deposit: re-enter MechRequestRound + # for ``_retry_pending``, not forward to MechResponseRound. + OFFCHAIN_DEPOSIT_TX_SUBMITTER: Event.OFFCHAIN_MECH_DEPOSIT_SETTLED, } synced_data = SynchronizedData(self.synchronized_data.db) event = submitter_to_event.get(synced_data.tx_submitter, Event.UNRECOGNIZED) + # An unrecognized submitter sends the round to + # FailedMultiplexerRound and silently drops the settled tx — + # including an off-chain mech deposit, where the funds have + # moved but the retry never fires. Log the offending value at + # WARNING so the cause is visible in agent logs instead of only + # in raw Tendermint state. + if event == Event.UNRECOGNIZED: + self.context.logger.warning( + f"PostTxSettlementRound: unrecognized tx_submitter " + f"{synced_data.tx_submitter!r}; routing to " + f"FailedMultiplexerRound. Settled tx is dropped." + ) + # if a bet was just placed, edit the utilized tools mapping if event in (Event.BET_PLACEMENT_DONE, Event.SELL_OUTCOME_TOKENS_DONE): utilized_tools = synced_data.utilized_tools @@ -221,6 +241,15 @@ class FinishedPolymarketWithdrawTopUpTxRound(DegenerateRound): """Round that represents that a Safe→DepositWallet CTF withdrawal top-up has settled.""" +class FinishedOffchainMechDepositSettledRound(DegenerateRound): + """Round that represents an off-chain mech auto-deposit has settled. + + The composing app routes this back into MechRequestRound so the + off-chain executor's ``_retry_pending`` re-POSTs the cached + signed request to the mech with the freshly deposited balance. + """ + + class TxSettlementMultiplexerAbciApp(AbciApp[Event]): """TxSettlementMultiplexerAbciApp @@ -247,8 +276,9 @@ class TxSettlementMultiplexerAbciApp(AbciApp[Event]): - withdraw omen done: 11. - top up done: 12. - withdraw top up done: 13. + - offchain mech deposit settled: 15. - round timeout: 1. - - unrecognized: 15. + - unrecognized: 16. 2. ChecksPassedRound 3. FinishedMechRequestTxRound 4. FinishedBetPlacementTxRound @@ -262,9 +292,10 @@ class TxSettlementMultiplexerAbciApp(AbciApp[Event]): 12. FinishedPolymarketTopUpTxRound 13. FinishedPolymarketWithdrawTopUpTxRound 14. FinishedStakingTxRound - 15. FailedMultiplexerRound + 15. FinishedOffchainMechDepositSettledRound + 16. FailedMultiplexerRound - Final states: {ChecksPassedRound, FailedMultiplexerRound, FinishedBetPlacementTxRound, FinishedMechRequestTxRound, FinishedOmenWithdrawTxRound, FinishedPolymarketSwapTxRound, FinishedPolymarketTopUpTxRound, FinishedPolymarketWithdrawTopUpTxRound, FinishedPolymarketWrapCollateralTxRound, FinishedRedeemingTxRound, FinishedSellOutcomeTokensTxRound, FinishedSetApprovalTxRound, FinishedStakingTxRound, FinishedSubscriptionTxRound} + Final states: {ChecksPassedRound, FailedMultiplexerRound, FinishedBetPlacementTxRound, FinishedMechRequestTxRound, FinishedOffchainMechDepositSettledRound, FinishedOmenWithdrawTxRound, FinishedPolymarketSwapTxRound, FinishedPolymarketTopUpTxRound, FinishedPolymarketWithdrawTopUpTxRound, FinishedPolymarketWrapCollateralTxRound, FinishedRedeemingTxRound, FinishedSellOutcomeTokensTxRound, FinishedSetApprovalTxRound, FinishedStakingTxRound, FinishedSubscriptionTxRound} Timeouts: round timeout: 30.0 @@ -292,6 +323,7 @@ class TxSettlementMultiplexerAbciApp(AbciApp[Event]): Event.WITHDRAW_OMEN_DONE: FinishedOmenWithdrawTxRound, Event.TOP_UP_DONE: FinishedPolymarketTopUpTxRound, Event.WITHDRAW_TOP_UP_DONE: FinishedPolymarketWithdrawTopUpTxRound, + Event.OFFCHAIN_MECH_DEPOSIT_SETTLED: FinishedOffchainMechDepositSettledRound, Event.ROUND_TIMEOUT: PostTxSettlementRound, Event.UNRECOGNIZED: FailedMultiplexerRound, }, @@ -308,6 +340,7 @@ class TxSettlementMultiplexerAbciApp(AbciApp[Event]): FinishedPolymarketTopUpTxRound: {}, FinishedPolymarketWithdrawTopUpTxRound: {}, FinishedStakingTxRound: {}, + FinishedOffchainMechDepositSettledRound: {}, FailedMultiplexerRound: {}, } event_to_timeout: Dict[Event, float] = { @@ -327,6 +360,7 @@ class TxSettlementMultiplexerAbciApp(AbciApp[Event]): FinishedStakingTxRound, FinishedSubscriptionTxRound, FinishedSetApprovalTxRound, + FinishedOffchainMechDepositSettledRound, FailedMultiplexerRound, } db_pre_conditions: Dict[AppState, Set[str]] = { @@ -348,4 +382,5 @@ class TxSettlementMultiplexerAbciApp(AbciApp[Event]): FailedMultiplexerRound: set(), FinishedSubscriptionTxRound: set(), FinishedSetApprovalTxRound: set(), + FinishedOffchainMechDepositSettledRound: set(), } diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml index aef1510df0..545629444e 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml @@ -10,16 +10,16 @@ fingerprint: __init__.py: bafybeibqo2mxxerubntdgmthgpn3ep6xx7dblg7sw3jangnkpuynaazafi behaviours.py: bafybeigeyw2xqizwncplct7e5e5chgbgc3ga2xfkcuckp4jinsxti2a7im dialogues.py: bafybeibjyeuiqonquqx4hnovbkippxk3rng4q42t5n4rb77b642h6wa72y - fsm_specification.yaml: bafybeidq6o2ukfyi7gzafqs2l7kozji6xivrkvybdlxem5tdr3etxjlqru + fsm_specification.yaml: bafybeib4l54pg6awojhyzvuk3k6hum24mchpfdx6ctum4nj7ichd3yagvm handlers.py: bafybeia6za2bibaq6qmly2qubsecdicpn5z74dji3nnhiupcztqi5t32e4 models.py: bafybeiaimrptp4robcgxfdxdpryckavajngxs42endlvkk4nx76hvvkseq - rounds.py: bafybeienszvoyv6mdauplicwpyntgywnnrthotjhpxmii2f7dvm4sll4iy + rounds.py: bafybeifghlt7n7tcoerg4avjdvax7jv2cr2ebax7p65merz5vspli2bdtq tests/__init__.py: bafybeiat74pbtmxvylsz7karp57qp2v7y6wtrsz572jkrghbcssoudgjay tests/test_behaviours.py: bafybeiftbjn4kjfkjvvdwvppicdmtj6ot7w5q5ukzpk3i6efnrooqudvxa tests/test_dialogues.py: bafybeihcbhqvl7aiebqt44hd7xrvo7bgxa4w32xalgqjcencttgx7nr7ga tests/test_handlers.py: bafybeidtj4finmjfer5jmub7scxd4pdnwy45xcmzysjxo5vamlubjdafdq tests/test_models.py: bafybeihtvjuhraizphead4khb65kyd2ulsoqok7sllhgttdjxg4aypfdum - tests/test_rounds.py: bafybeic65lmwbqcz3eejgyiph3uhip4yt25zlgslw56bvdjybqndg6ymku + tests/test_rounds.py: bafybeihq37kan3bea2krs4lr2lyf6z77l625wh423enzw2w2jtd7j7g7sa fingerprint_ignore_patterns: [] connections: [] contracts: [] @@ -27,9 +27,9 @@ protocols: - valory/ledger_api:1.0.0:bafybeiecq56phjfws36rgrefw6niyo4ezesloodsfis647mpm5ygqo4ysi skills: - valory/abstract_round_abci:0.1.0:bafybeicioxhbhnsoqyqvkeevd7df7r2vubbiglyf7ucps2el73objazjsq -- valory/decision_maker_abci:0.1.0:bafybeigterfcylnzjzxpja6u56gvcq2grcgvia2qcj34yr2ksogss33wuu +- valory/decision_maker_abci:0.1.0:bafybeiewwbtf3w5zzs2u22vudkjz5u2xnmvgx7hygo3bmjgn6q32ae6vne - valory/staking_abci:0.1.0:bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq -- valory/mech_interact_abci:0.1.0:bafybeidnmszufszq3ro4ebgrqzmhqgctrsc6sykeanfsbvotghvt2cgfsy +- valory/mech_interact_abci:0.1.0:bafybeihhwzpa6x5ypth426tzd2zjsnys6jmjaab4zvk4edisetzktft754 behaviours: main: args: {} diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/tests/test_rounds.py b/packages/valory/skills/tx_settlement_multiplexer_abci/tests/test_rounds.py index 4d960a7a01..cb3630f865 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/tests/test_rounds.py +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/tests/test_rounds.py @@ -60,6 +60,7 @@ FailedMultiplexerRound, FinishedBetPlacementTxRound, FinishedMechRequestTxRound, + FinishedOffchainMechDepositSettledRound, FinishedOmenWithdrawTxRound, FinishedPolymarketSwapTxRound, FinishedPolymarketTopUpTxRound, @@ -420,6 +421,43 @@ def test_unrecognized_submitter(self) -> None: assert event == Event.UNRECOGNIZED assert synced_data is mock_synced round_.synchronized_data.update.assert_not_called() # type: ignore[attr-defined] + # The dispatch logs an UNRECOGNIZED warning so a silently-dropped + # tx surfaces in agent logs instead of only in raw Tendermint + # state — guards against the off-chain deposit getting routed + # to FailedMultiplexerRound without a trail. + round_.context.logger.warning.assert_called_once() + + def test_offchain_deposit_submitter_dispatches_to_settled_event(self) -> None: + """The off-chain sentinel routes a settled deposit back to MechRequestRound. + + Without this dispatch the multiplexer would not recognise the + ``OFFCHAIN_DEPOSIT_TX_SUBMITTER`` sentinel and fall through to + ``Event.UNRECOGNIZED``, dropping the settled deposit into + ``FailedMultiplexerRound`` so ``_retry_pending`` never fires. + Pin the literal sentinel value too: an identity-only check + against the imported symbol would let a silent rename move + both sides together while the mech-interact-side executor + (which hardcodes the string) breaks. + """ + from packages.valory.skills.mech_interact_abci.states.request import ( + OFFCHAIN_DEPOSIT_TX_SUBMITTER, + ) + + round_ = self._create_round() + + with patch( + "packages.valory.skills.tx_settlement_multiplexer_abci.rounds.SynchronizedData" + ) as MockSyncData: + mock_synced = MagicMock() + mock_synced.tx_submitter = OFFCHAIN_DEPOSIT_TX_SUBMITTER + MockSyncData.return_value = mock_synced + + result = round_.end_block() + + assert result is not None + _, event = result + assert event == Event.OFFCHAIN_MECH_DEPOSIT_SETTLED + assert OFFCHAIN_DEPOSIT_TX_SUBMITTER == "mech_request_round_offchain_deposit" # type: ignore[attr-defined] def test_mech_requesting_done_does_not_update_policy(self) -> None: @@ -632,6 +670,7 @@ def test_transition_function( Event.WITHDRAW_OMEN_DONE: FinishedOmenWithdrawTxRound, Event.TOP_UP_DONE: FinishedPolymarketTopUpTxRound, Event.WITHDRAW_TOP_UP_DONE: FinishedPolymarketWithdrawTopUpTxRound, + Event.OFFCHAIN_MECH_DEPOSIT_SETTLED: FinishedOffchainMechDepositSettledRound, Event.ROUND_TIMEOUT: PostTxSettlementRound, Event.UNRECOGNIZED: FailedMultiplexerRound, }, @@ -648,6 +687,7 @@ def test_transition_function( FinishedPolymarketTopUpTxRound: {}, FinishedPolymarketWithdrawTopUpTxRound: {}, FinishedStakingTxRound: {}, + FinishedOffchainMechDepositSettledRound: {}, FailedMultiplexerRound: {}, } assert abci_app.transition_function == expected @@ -668,6 +708,7 @@ def test_final_states(self, abci_app: TxSettlementMultiplexerAbciApp) -> None: FinishedStakingTxRound, FinishedSubscriptionTxRound, FinishedSetApprovalTxRound, + FinishedOffchainMechDepositSettledRound, FailedMultiplexerRound, } assert abci_app.final_states == expected_final @@ -701,12 +742,13 @@ def test_db_post_conditions(self, abci_app: TxSettlementMultiplexerAbciApp) -> N FailedMultiplexerRound: set(), FinishedSubscriptionTxRound: set(), FinishedSetApprovalTxRound: set(), + FinishedOffchainMechDepositSettledRound: set(), } assert abci_app.db_post_conditions == expected def test_final_states_count(self, abci_app: TxSettlementMultiplexerAbciApp) -> None: - """Test that there are exactly 14 final states.""" - assert len(abci_app.final_states) == 14 + """Test that there are exactly 15 final states.""" + assert len(abci_app.final_states) == 15 def test_degenerate_rounds_have_empty_transitions( self, abci_app: TxSettlementMultiplexerAbciApp diff --git a/pyproject.toml b/pyproject.toml index 6e61bd84b9..1e899ecb04 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -79,7 +79,7 @@ check_dependencies_extra_excludes = [ "urllib3", ] upstream_pins = [ - "valory-xyz/mech-interact@v0.32.2", + "valory-xyz/mech-interact@v0.32.4-rc1", "valory-xyz/genai@v7.2.1", "valory-xyz/kv-store@v0.6.0", "valory-xyz/funds-manager@v3.1.1", From 782233ec13dd042263c3b5e1d549bab9f74113e8 Mon Sep 17 00:00:00 2001 From: DivyaNautiyal07 Date: Wed, 1 Jul 2026 14:43:01 +0530 Subject: [PATCH 2/4] =?UTF-8?q?fix(offchain):=20address=20PR=20#1002=20rev?= =?UTF-8?q?iew=20=E2=80=94=20contract=20registration=20+=20native=20cap=20?= =?UTF-8?q?+=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three findings from bennyjo: 1. [Blocking] The three new mech-interact contracts (mech_marketplace, balance_tracker_fixed_price_native/_token) were vendored via the skill dependency but not registered in the agent aea-config's ``contracts:`` section, so the first off-chain contract call under ``use_offchain: true`` (``MechMarketplace.get_chain_id`` etc.) would fail to resolve at runtime. Added the three contracts to ``packages/valory/agents/trader/aea-config.yaml`` alongside the existing mech-interact contract entries. 2. ``trader_pearl/service.yaml`` inherited the polymarket_trader default for ``auto_deposit_cap_per_cycle`` (5000000 — 5 USDC at 6 decimals), but pearl runs against an 18-decimal native/token denomination where 5000000 wei is dust; every auto-deposit would silently fail over instead of funding the request. Bumped to 5000000000000000000 (5 xDAI at 18 decimals) so the two services carry equivalent-scale defaults. 3. Added ``test_offchain_deposit_sentinel_treated_as_mech_timeout`` under ``decision_maker_abci/tests/behaviours/test_handle_failed_tx.py`` — asserts on ``shared_state.mech_timed_out`` (captured via a mock) in addition to the payload, and pins the literal sentinel value (mirrors the multiplexer test the reviewer flagged). Also mirrors optimus#355 — same aea-config omission is being applied there in a follow-up commit. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/packages.json | 19 +++--- packages/valory/agents/trader/aea-config.yaml | 9 ++- .../services/polymarket_trader/service.yaml | 2 +- .../valory/services/trader_pearl/service.yaml | 6 +- .../skills/decision_maker_abci/skill.yaml | 2 +- .../tests/behaviours/test_handle_failed_tx.py | 62 ++++++++++++++++++- packages/valory/skills/trader_abci/skill.yaml | 4 +- .../tx_settlement_multiplexer_abci/skill.yaml | 2 +- 8 files changed, 86 insertions(+), 20 deletions(-) diff --git a/packages/packages.json b/packages/packages.json index 791e5284f5..e3b0e2dbc8 100644 --- a/packages/packages.json +++ b/packages/packages.json @@ -9,16 +9,16 @@ "contract/valory/deposit_wallet/0.1.0": "bafybeidjkryojg7cv4hrjvrd2hm5cv5kdoqrmhdsxyjriwtdpo4v3avoia", "connection/valory/polymarket_client/0.1.0": "bafybeid4eo37pka4tfhsjs6rb3knrugmokcvihust2dpfrgob56y77xd44", "skill/valory/market_manager_abci/0.1.0": "bafybeic67hypwetzltnuy3a6y3o2o332lxyvn34buq57gy4n6bfqpbpxjm", - "skill/valory/decision_maker_abci/0.1.0": "bafybeigterfcylnzjzxpja6u56gvcq2grcgvia2qcj34yr2ksogss33wuu", - "skill/valory/trader_abci/0.1.0": "bafybeifepfhwcrbinv22hlltrf2cfacqybzsdnm63knw73yc5yfoer3ks4", - "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeiglvalfzo744cvxvslx4vo42r4tcozn7hzsn3aa2q3hkm77t77xwe", + "skill/valory/decision_maker_abci/0.1.0": "bafybeiblakfjutvn2ambiklxccxoe3wuuk7ul3rytjonj3slqsks2jswsu", + "skill/valory/trader_abci/0.1.0": "bafybeifda2deiqrpeov477u2qmeimqgite2h3q6b4yvpbf4t23mi5wgwve", + "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeidu6cxgtbxp7fix2giljdezb5rppwwj4ppf533fuw2ggbnpsyn4di", "skill/valory/staking_abci/0.1.0": "bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq", "skill/valory/agent_performance_summary_abci/0.1.0": "bafybeigmmvpncem6i6t57nwjqzajrbnf6rnqgp43mlo6jf6uziq6lrhlca", - "skill/valory/check_stop_trading_abci/0.1.0": "bafybeifbiko6p3sqqg2q6qemmcig432s5djcsxm44j35ejittlpyr5f6z4", + "skill/valory/check_stop_trading_abci/0.1.0": "bafybeiexmdtj3qfjnhh2sy3fa4hwxkvqogsy7u46liobzhgilzogeoezeu", "skill/valory/chatui_abci/0.1.0": "bafybeie2kmgihgk3rwpzelaa76ypvchsyg2vy3me4vxlbjttaq4frs3ipa", - "agent/valory/trader/0.1.0": "bafybeifdcmuilvxj5gf3d7dumlgcab3qwsp2xkmhqfnfxef3zxulpbthxy", - "service/valory/trader_pearl/0.1.0": "bafybeigqqgmku426wk2pr2344s4347qmxozppwuexdup3ugwj36aasdq64", - "service/valory/polymarket_trader/0.1.0": "bafybeign7qvajyzxojpd2iokvitfil2ygnazpn5w6uyq2u7aex4s5hf5za" + "agent/valory/trader/0.1.0": "bafybeigeanhy3texx7mpnedcdaknwyzo4abf3w6eo2cix33piuflk5vg6u", + "service/valory/trader_pearl/0.1.0": "bafybeicccq52q3xbhjrx6qzzacyyyrcyhkuhtdpefl35xf236yrbo5nisy", + "service/valory/polymarket_trader/0.1.0": "bafybeiaqgzgiymobbinmif5liojpbsbavorobauujrgnwtjez4etmljwl4" }, "third_party": { "protocol/valory/acn_data_share/0.1.0": "bafybeieqisfr6lhaaesq37lk7vyaxza2h6nucshksgyo2djqfyf2saqo4i", @@ -55,6 +55,9 @@ "contract/valory/agreement_store_manager/0.1.0": "bafybeign6u6635cpp7z2rws7uaaxgzvyokdyzztnadmivbt2qsvw2q2vza", "contract/valory/transfer_nft_condition/0.1.0": "bafybeib6wigs3ufiuzkj6twlthcya67lswm3qosikrg4ez7jjgkam4kz5m", "contract/valory/subscription_provider/0.1.0": "bafybeia7fmpemztyjwu4pu4p3q2udy7ymrxz4p5eklegdlc2bgnfi2zoae", + "contract/valory/mech_marketplace/0.1.0": "bafybeieadbmhzndxe6jcfwujcpjrljpc5kfwffkd3zzpg75uxksufn4l3i", + "contract/valory/balance_tracker_fixed_price_native/0.1.0": "bafybeifobvptvc7mkrztfij664dqqegl6qi32773zewvyuftes32faemw4", + "contract/valory/balance_tracker_fixed_price_token/0.1.0": "bafybeienpn5nb7mgiw5uitm5mjwcgc2xd7bzx5rxu2mqsvjziwvlg6poxa", "connection/valory/http_client/0.23.0": "bafybeihel6sg2yayxu7lqygaswdgciaxpqrgsbl5rwx74c6znu5qz2edd4", "connection/valory/p2p_libp2p_client/0.1.0": "bafybeielj3jso3wvrarp5n5rq7llpw4vgxybqiyensgjalb5ubfiawwhhu", "connection/valory/x402/0.1.0": "bafybeicqjg3d6pnlcsu4442qt5tmsjqkqdtc3ulvbjgoh53jyr7z3lbqqi", @@ -69,7 +72,7 @@ "skill/valory/registration_abci/0.1.0": "bafybeihjhbn5seffyu5cwugvm26fkamp3svhggmtzh577daijgl2ksxs3e", "skill/valory/reset_pause_abci/0.1.0": "bafybeihc4ruh25s7wuunfy2b3k2n4eypyhvtry3usgom44wsymagbcr3ki", "skill/valory/termination_abci/0.1.0": "bafybeibnnzry5kknci3z46gcjgutv4jid3ir6xn6a5adq3tx6v2e25augq", - "skill/valory/mech_interact_abci/0.1.0": "bafybeidnmszufszq3ro4ebgrqzmhqgctrsc6sykeanfsbvotghvt2cgfsy", + "skill/valory/mech_interact_abci/0.1.0": "bafybeihhwzpa6x5ypth426tzd2zjsnys6jmjaab4zvk4edisetzktft754", "skill/valory/funds_manager/0.1.0": "bafybeibne4vkmbper3ryn7q6kt7lclbyylgorziscyn6msr5qt46aihv4m" } } \ No newline at end of file diff --git a/packages/valory/agents/trader/aea-config.yaml b/packages/valory/agents/trader/aea-config.yaml index b85ed5d94c..6a04ffa4fc 100644 --- a/packages/valory/agents/trader/aea-config.yaml +++ b/packages/valory/agents/trader/aea-config.yaml @@ -40,6 +40,9 @@ contracts: - valory/ierc1155:0.1.0:bafybeif3wfclopxa3panep4xzgodlfclgypm3balncxyuxbhhvgz7imulq - valory/nvm_balance_tracker_token:0.1.0:bafybeifwxkaobltpm77oh2b54kuclm4vtx2bzpuoowqfdemkex5gb5yyfa - valory/nvm_balance_tracker_native:0.1.0:bafybeibou3doazirk637cyey4o33pz7fpdm4hsgdj7vd2kctuqxtjgnmla +- valory/mech_marketplace:0.1.0:bafybeieadbmhzndxe6jcfwujcpjrljpc5kfwffkd3zzpg75uxksufn4l3i +- valory/balance_tracker_fixed_price_native:0.1.0:bafybeifobvptvc7mkrztfij664dqqegl6qi32773zewvyuftes32faemw4 +- valory/balance_tracker_fixed_price_token:0.1.0:bafybeienpn5nb7mgiw5uitm5mjwcgc2xd7bzx5rxu2mqsvjziwvlg6poxa - valory/escrow_payment_condition:0.1.0:bafybeibux6vafcoevxqz3s7goyv2mdq6pxjlvw62ewclhngo3xcm23i6r4 - valory/did_registry:0.1.0:bafybeiaz5vsh2qkcbjzteada32kz5l3xfwioo7tsrz5pa3zncz63gj7jye - valory/nft_sales:0.1.0:bafybeiacttyhd4re5jaybtvoawlzsoxhy2npavwc7k7isqhuv6s73cc7be @@ -66,10 +69,10 @@ skills: - valory/reset_pause_abci:0.1.0:bafybeihc4ruh25s7wuunfy2b3k2n4eypyhvtry3usgom44wsymagbcr3ki - valory/termination_abci:0.1.0:bafybeibnnzry5kknci3z46gcjgutv4jid3ir6xn6a5adq3tx6v2e25augq - valory/transaction_settlement_abci:0.1.0:bafybeibv3tycpdhphlblu62zpcbjsj7hnwkutexxqagorkelhjlt4t4fii -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeiboec4uzlj2yd5oxyg2feh6j26uez55g2d6fxs3xizltchdsqhk5i +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeidu6cxgtbxp7fix2giljdezb5rppwwj4ppf533fuw2ggbnpsyn4di - valory/market_manager_abci:0.1.0:bafybeic67hypwetzltnuy3a6y3o2o332lxyvn34buq57gy4n6bfqpbpxjm -- valory/decision_maker_abci:0.1.0:bafybeiewwbtf3w5zzs2u22vudkjz5u2xnmvgx7hygo3bmjgn6q32ae6vne -- valory/trader_abci:0.1.0:bafybeibfad73kv2ena463bzyg4xxpksebikoz23bcbwvcqb2bwgmyrd6bu +- valory/decision_maker_abci:0.1.0:bafybeiblakfjutvn2ambiklxccxoe3wuuk7ul3rytjonj3slqsks2jswsu +- valory/trader_abci:0.1.0:bafybeifda2deiqrpeov477u2qmeimqgite2h3q6b4yvpbf4t23mi5wgwve - valory/staking_abci:0.1.0:bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq - valory/check_stop_trading_abci:0.1.0:bafybeiexmdtj3qfjnhh2sy3fa4hwxkvqogsy7u46liobzhgilzogeoezeu - valory/mech_interact_abci:0.1.0:bafybeihhwzpa6x5ypth426tzd2zjsnys6jmjaab4zvk4edisetzktft754 diff --git a/packages/valory/services/polymarket_trader/service.yaml b/packages/valory/services/polymarket_trader/service.yaml index 69e8b5929e..9d96004167 100644 --- a/packages/valory/services/polymarket_trader/service.yaml +++ b/packages/valory/services/polymarket_trader/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeichoh5tnk4qctaazcjcrxvpwc5yasodleqoeapnfapwrrdh3tm5gu fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeifdcmuilvxj5gf3d7dumlgcab3qwsp2xkmhqfnfxef3zxulpbthxy +agent: valory/trader:0.1.0:bafybeigeanhy3texx7mpnedcdaknwyzo4abf3w6eo2cix33piuflk5vg6u number_of_agents: 1 deployment: agent: diff --git a/packages/valory/services/trader_pearl/service.yaml b/packages/valory/services/trader_pearl/service.yaml index ba6faf2a90..a3b33558da 100644 --- a/packages/valory/services/trader_pearl/service.yaml +++ b/packages/valory/services/trader_pearl/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeibg7bdqpioh4lmvknw3ygnllfku32oca4eq5pqtvdrdsgw6buko7e fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeifdcmuilvxj5gf3d7dumlgcab3qwsp2xkmhqfnfxef3zxulpbthxy +agent: valory/trader:0.1.0:bafybeigeanhy3texx7mpnedcdaknwyzo4abf3w6eo2cix33piuflk5vg6u number_of_agents: 1 deployment: agent: @@ -131,11 +131,11 @@ models: redeem_round_timeout: ${REDEEM_ROUND_TIMEOUT:float:3600.0} withdrawal_round_timeout: ${WITHDRAWAL_ROUND_TIMEOUT:float:1800.0} contract_timeout: ${CONTRACT_TIMEOUT:float:300.0} - file_hash_to_strategies: ${FILE_HASH_TO_STRATEGIES:dict:{"bafybeidme2uybzyzagky3jtosheqmpgc6b6w4rum7cdxw2fc35nnpwblfe":["kelly_criterion"],"bafybeigp65doxrfukxdndsyflukyf6tjigvobig42334e2gfncczteujvm":["fixed_bet"]}} + file_hash_to_strategies: ${FILE_HASH_TO_STRATEGIES:dict:{"bafybeididlcixparvundh76gajplac2ab4ftzcom4cyaeli2ofl5dkdhaa":["kelly_criterion"],"bafybeigp65doxrfukxdndsyflukyf6tjigvobig42334e2gfncczteujvm":["fixed_bet"]}} strategies_kwargs: ${STRATEGIES_KWARGS:dict:{"floor_balance":0,"default_max_bet_size":2000000000000000000,"absolute_min_bet_size":25000000000000000,"absolute_max_bet_size":2000000000000000000,"n_bets":1,"min_edge":0.03,"min_oracle_prob":0.5,"fee_per_trade":10000000000000000,"grid_points":500}} use_subgraph_for_redeeming: ${USE_SUBGRAPH_FOR_REDEEMING:bool:true} use_mech_marketplace: ${USE_MECH_MARKETPLACE:bool:false} - mech_marketplace_config: ${MECH_MARKETPLACE_CONFIG:dict:{"mech_marketplace_address":"0x4554fE75c1f5576c1d7F765B2A036c199Adae329","priority_mech_address":"0x0000000000000000000000000000000000000000","priority_mech_staking_instance_address":"0x998dEFafD094817EF329f6dc79c703f1CF18bC90","priority_mech_service_id":975,"requester_staking_instance_address":"0x0000000000000000000000000000000000000000","response_timeout":300}} + mech_marketplace_config: ${MECH_MARKETPLACE_CONFIG:dict:{"mech_marketplace_address":"0x4554fE75c1f5576c1d7F765B2A036c199Adae329","priority_mech_address":"0x0000000000000000000000000000000000000000","priority_mech_staking_instance_address":"0x998dEFafD094817EF329f6dc79c703f1CF18bC90","priority_mech_service_id":975,"requester_staking_instance_address":"0x0000000000000000000000000000000000000000","response_timeout":300,"use_dynamic_mech_selection":false,"use_offchain":false,"offchain_url":null,"offchain_deposit_target_calls":10,"auto_deposit_cap_per_cycle":5000000000000000000,"offchain_poll_interval_seconds":3.0,"offchain_poll_timeout_seconds":300.0,"offchain_failover_max_retries":2}} service_endpoint: ${SERVICE_ENDPOINT:str:https://trader.autonolas.tech/} rpc_sleep_time: ${RPC_SLEEP_TIME:int:10} safe_voting_range: ${SAFE_VOTING_RANGE:int:600} diff --git a/packages/valory/skills/decision_maker_abci/skill.yaml b/packages/valory/skills/decision_maker_abci/skill.yaml index 816625ee60..517f03fe55 100644 --- a/packages/valory/skills/decision_maker_abci/skill.yaml +++ b/packages/valory/skills/decision_maker_abci/skill.yaml @@ -93,7 +93,7 @@ fingerprint: tests/behaviours/test_check_benchmarking.py: bafybeihfdlrjliykbuwfqsv3snkgzge3jfug3dezp7uan5qooufoevtbnq tests/behaviours/test_decision_receive.py: bafybeicslgo66uln6su5cz4td54rgwyegbvna2gr6h5lg33mlusu2bl6v4 tests/behaviours/test_decision_request.py: bafybeiacd7ji65apfapxongatdljsne6kl3q3sgmzgkgihtevgz5hfppky - tests/behaviours/test_handle_failed_tx.py: bafybeicu7km3os7kdlwvvmkj6avscj2gbjwtylpue7o4huiqi4pyb62p7a + tests/behaviours/test_handle_failed_tx.py: bafybeift5shvfizbmqeggd2vhpm254wtnx62bydr6pgj6zyirmapef4ugq tests/behaviours/test_omen_withdrawal_store.py: bafybeia6oof3z4v5vy4gewcnu5yidmfyew47mln5nv4bridoukhyyt2zcq tests/behaviours/test_polymarket_bet_placement.py: bafybeicrhoobbkav3xhrmlrfodzhjrscdpfux6o334uamavut2pnnkfazq tests/behaviours/test_polymarket_dw_behaviours_extra.py: bafybeihgndegqjnrnrbpm767jfm6facokhrb5dncpzqlwqcodyjdelnvoi diff --git a/packages/valory/skills/decision_maker_abci/tests/behaviours/test_handle_failed_tx.py b/packages/valory/skills/decision_maker_abci/tests/behaviours/test_handle_failed_tx.py index 349c0275be..18180ae57d 100644 --- a/packages/valory/skills/decision_maker_abci/tests/behaviours/test_handle_failed_tx.py +++ b/packages/valory/skills/decision_maker_abci/tests/behaviours/test_handle_failed_tx.py @@ -34,7 +34,10 @@ from packages.valory.skills.decision_maker_abci.states.sell_outcome_tokens import ( SellOutcomeTokensRound, ) -from packages.valory.skills.mech_interact_abci.states.request import MechRequestRound +from packages.valory.skills.mech_interact_abci.states.request import ( + MechRequestRound, + OFFCHAIN_DEPOSIT_TX_SUBMITTER, +) # --------------------------------------------------------------------------- # Helpers @@ -132,3 +135,60 @@ def test_payload_has_handle_failed_tx_submitter(self) -> None: payload = _run_async_act(behaviour, "some_round") assert payload.tx_submitter == HandleFailedTxRound.auto_round_id() + + def test_offchain_deposit_sentinel_treated_as_mech_timeout(self) -> None: + """The off-chain deposit sentinel must produce the same bookkeeping as + an on-chain mech timeout. + + Without this branch the off-chain failure path leaves + ``shared_state.mech_timed_out`` False and + ``after_bet_attempt`` False, so the tool-quarantine bookkeeping + that the on-chain mech-timeout path relies on silently skips. + Pin the literal sentinel value (not just identity against the + imported symbol) — a rename that moves both sides together would + still break the mech-interact executor, which hardcodes the string. + """ + # Capture the shared_state.mech_timed_out assignment so we can + # assert on it (the base MagicMock accepts anything silently). + shared_state = MagicMock() + + behaviour = _make_behaviour() + + payloads_sent = [] # type: ignore[no-untyped-def] + + def mock_finish(payload) -> None: # type: ignore[no-untyped-def, misc] + payloads_sent.append(payload) + yield # type: ignore[no-untyped-def] + + behaviour.finish_behaviour = mock_finish # type: ignore[method-assign] + + with patch.object( + type(behaviour), "synchronized_data", new_callable=PropertyMock + ) as mock_sd: + sd = MagicMock() + sd.tx_submitter = OFFCHAIN_DEPOSIT_TX_SUBMITTER + mock_sd.return_value = sd + + with patch.object( + type(behaviour), "shared_state", new_callable=PropertyMock + ) as mock_ss: + mock_ss.return_value = shared_state + + gen = behaviour.async_act() + try: + while True: + next(gen) + except StopIteration: + pass + + assert len(payloads_sent) == 1 + payload = payloads_sent[0] + assert isinstance(payload, HandleFailedTxPayload) + # Symmetric with the on-chain mech timeout: after_bet_attempt True. + assert payload.vote is True + # And the mech-timed-out flag was actually raised so the tool + # quarantine bookkeeping runs on the next cycle. + assert shared_state.mech_timed_out is True + # Pin the literal sentinel value so a silent rename in + # mech-interact fails a trader test instead of a runtime warning. + assert OFFCHAIN_DEPOSIT_TX_SUBMITTER == "mech_request_round_offchain_deposit" diff --git a/packages/valory/skills/trader_abci/skill.yaml b/packages/valory/skills/trader_abci/skill.yaml index c6e901b572..12971a1557 100644 --- a/packages/valory/skills/trader_abci/skill.yaml +++ b/packages/valory/skills/trader_abci/skill.yaml @@ -57,8 +57,8 @@ skills: - valory/transaction_settlement_abci:0.1.0:bafybeibv3tycpdhphlblu62zpcbjsj7hnwkutexxqagorkelhjlt4t4fii - valory/termination_abci:0.1.0:bafybeibnnzry5kknci3z46gcjgutv4jid3ir6xn6a5adq3tx6v2e25augq - valory/market_manager_abci:0.1.0:bafybeic67hypwetzltnuy3a6y3o2o332lxyvn34buq57gy4n6bfqpbpxjm -- valory/decision_maker_abci:0.1.0:bafybeiewwbtf3w5zzs2u22vudkjz5u2xnmvgx7hygo3bmjgn6q32ae6vne -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeiboec4uzlj2yd5oxyg2feh6j26uez55g2d6fxs3xizltchdsqhk5i +- valory/decision_maker_abci:0.1.0:bafybeiblakfjutvn2ambiklxccxoe3wuuk7ul3rytjonj3slqsks2jswsu +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeidu6cxgtbxp7fix2giljdezb5rppwwj4ppf533fuw2ggbnpsyn4di - valory/staking_abci:0.1.0:bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq - valory/check_stop_trading_abci:0.1.0:bafybeiexmdtj3qfjnhh2sy3fa4hwxkvqogsy7u46liobzhgilzogeoezeu - valory/mech_interact_abci:0.1.0:bafybeihhwzpa6x5ypth426tzd2zjsnys6jmjaab4zvk4edisetzktft754 diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml index 545629444e..baad2e240c 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml @@ -27,7 +27,7 @@ protocols: - valory/ledger_api:1.0.0:bafybeiecq56phjfws36rgrefw6niyo4ezesloodsfis647mpm5ygqo4ysi skills: - valory/abstract_round_abci:0.1.0:bafybeicioxhbhnsoqyqvkeevd7df7r2vubbiglyf7ucps2el73objazjsq -- valory/decision_maker_abci:0.1.0:bafybeiewwbtf3w5zzs2u22vudkjz5u2xnmvgx7hygo3bmjgn6q32ae6vne +- valory/decision_maker_abci:0.1.0:bafybeiblakfjutvn2ambiklxccxoe3wuuk7ul3rytjonj3slqsks2jswsu - valory/staking_abci:0.1.0:bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq - valory/mech_interact_abci:0.1.0:bafybeihhwzpa6x5ypth426tzd2zjsnys6jmjaab4zvk4edisetzktft754 behaviours: From 478e0a515aaa9c34ade1a303ec617fab0a20de9e Mon Sep 17 00:00:00 2001 From: DivyaNautiyal07 Date: Wed, 1 Jul 2026 15:37:45 +0530 Subject: [PATCH 3/4] chore: satisfy CI flake8 docstring (D205) on new test D205 wants exactly one blank line between the summary line and the extended description. Collapsed the summary onto one line. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/packages.json | 12 ++++++------ packages/valory/agents/trader/aea-config.yaml | 6 +++--- .../valory/services/polymarket_trader/service.yaml | 2 +- packages/valory/services/trader_pearl/service.yaml | 2 +- .../valory/skills/decision_maker_abci/skill.yaml | 2 +- .../tests/behaviours/test_handle_failed_tx.py | 3 +-- packages/valory/skills/trader_abci/skill.yaml | 4 ++-- .../skills/tx_settlement_multiplexer_abci/skill.yaml | 2 +- 8 files changed, 16 insertions(+), 17 deletions(-) diff --git a/packages/packages.json b/packages/packages.json index e3b0e2dbc8..1925e3b7dc 100644 --- a/packages/packages.json +++ b/packages/packages.json @@ -9,16 +9,16 @@ "contract/valory/deposit_wallet/0.1.0": "bafybeidjkryojg7cv4hrjvrd2hm5cv5kdoqrmhdsxyjriwtdpo4v3avoia", "connection/valory/polymarket_client/0.1.0": "bafybeid4eo37pka4tfhsjs6rb3knrugmokcvihust2dpfrgob56y77xd44", "skill/valory/market_manager_abci/0.1.0": "bafybeic67hypwetzltnuy3a6y3o2o332lxyvn34buq57gy4n6bfqpbpxjm", - "skill/valory/decision_maker_abci/0.1.0": "bafybeiblakfjutvn2ambiklxccxoe3wuuk7ul3rytjonj3slqsks2jswsu", - "skill/valory/trader_abci/0.1.0": "bafybeifda2deiqrpeov477u2qmeimqgite2h3q6b4yvpbf4t23mi5wgwve", - "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeidu6cxgtbxp7fix2giljdezb5rppwwj4ppf533fuw2ggbnpsyn4di", + "skill/valory/decision_maker_abci/0.1.0": "bafybeiebddoshz7szs22sm7fn2cb4ywb6oa46ohc2naqcoznggb3nde43u", + "skill/valory/trader_abci/0.1.0": "bafybeih2msftg5u3nxz5pwxj4ei7e6txvy2xtjizcedeuqtvii2dhjis2y", + "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeighlmd4xj64qf3xtgbcxvqnipcnsvv47npkrlatngan2e6r23elhm", "skill/valory/staking_abci/0.1.0": "bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq", "skill/valory/agent_performance_summary_abci/0.1.0": "bafybeigmmvpncem6i6t57nwjqzajrbnf6rnqgp43mlo6jf6uziq6lrhlca", "skill/valory/check_stop_trading_abci/0.1.0": "bafybeiexmdtj3qfjnhh2sy3fa4hwxkvqogsy7u46liobzhgilzogeoezeu", "skill/valory/chatui_abci/0.1.0": "bafybeie2kmgihgk3rwpzelaa76ypvchsyg2vy3me4vxlbjttaq4frs3ipa", - "agent/valory/trader/0.1.0": "bafybeigeanhy3texx7mpnedcdaknwyzo4abf3w6eo2cix33piuflk5vg6u", - "service/valory/trader_pearl/0.1.0": "bafybeicccq52q3xbhjrx6qzzacyyyrcyhkuhtdpefl35xf236yrbo5nisy", - "service/valory/polymarket_trader/0.1.0": "bafybeiaqgzgiymobbinmif5liojpbsbavorobauujrgnwtjez4etmljwl4" + "agent/valory/trader/0.1.0": "bafybeigotorqhbdig74qvmj2isqje3sjjq44s5yzjn3duqa4q2l2zf5zsi", + "service/valory/trader_pearl/0.1.0": "bafybeih3axeacmuluwrhktlpigh4fvu5xxwjwntreha6jc6ta464b77mnm", + "service/valory/polymarket_trader/0.1.0": "bafybeigdahvrxg4xl557afubw6byzq6spvsae72gzyewkibf4o3wocmmlq" }, "third_party": { "protocol/valory/acn_data_share/0.1.0": "bafybeieqisfr6lhaaesq37lk7vyaxza2h6nucshksgyo2djqfyf2saqo4i", diff --git a/packages/valory/agents/trader/aea-config.yaml b/packages/valory/agents/trader/aea-config.yaml index 6a04ffa4fc..b8c30961f1 100644 --- a/packages/valory/agents/trader/aea-config.yaml +++ b/packages/valory/agents/trader/aea-config.yaml @@ -69,10 +69,10 @@ skills: - valory/reset_pause_abci:0.1.0:bafybeihc4ruh25s7wuunfy2b3k2n4eypyhvtry3usgom44wsymagbcr3ki - valory/termination_abci:0.1.0:bafybeibnnzry5kknci3z46gcjgutv4jid3ir6xn6a5adq3tx6v2e25augq - valory/transaction_settlement_abci:0.1.0:bafybeibv3tycpdhphlblu62zpcbjsj7hnwkutexxqagorkelhjlt4t4fii -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeidu6cxgtbxp7fix2giljdezb5rppwwj4ppf533fuw2ggbnpsyn4di +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeighlmd4xj64qf3xtgbcxvqnipcnsvv47npkrlatngan2e6r23elhm - valory/market_manager_abci:0.1.0:bafybeic67hypwetzltnuy3a6y3o2o332lxyvn34buq57gy4n6bfqpbpxjm -- valory/decision_maker_abci:0.1.0:bafybeiblakfjutvn2ambiklxccxoe3wuuk7ul3rytjonj3slqsks2jswsu -- valory/trader_abci:0.1.0:bafybeifda2deiqrpeov477u2qmeimqgite2h3q6b4yvpbf4t23mi5wgwve +- valory/decision_maker_abci:0.1.0:bafybeiebddoshz7szs22sm7fn2cb4ywb6oa46ohc2naqcoznggb3nde43u +- valory/trader_abci:0.1.0:bafybeih2msftg5u3nxz5pwxj4ei7e6txvy2xtjizcedeuqtvii2dhjis2y - valory/staking_abci:0.1.0:bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq - valory/check_stop_trading_abci:0.1.0:bafybeiexmdtj3qfjnhh2sy3fa4hwxkvqogsy7u46liobzhgilzogeoezeu - valory/mech_interact_abci:0.1.0:bafybeihhwzpa6x5ypth426tzd2zjsnys6jmjaab4zvk4edisetzktft754 diff --git a/packages/valory/services/polymarket_trader/service.yaml b/packages/valory/services/polymarket_trader/service.yaml index 9d96004167..6912f8d735 100644 --- a/packages/valory/services/polymarket_trader/service.yaml +++ b/packages/valory/services/polymarket_trader/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeichoh5tnk4qctaazcjcrxvpwc5yasodleqoeapnfapwrrdh3tm5gu fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeigeanhy3texx7mpnedcdaknwyzo4abf3w6eo2cix33piuflk5vg6u +agent: valory/trader:0.1.0:bafybeigotorqhbdig74qvmj2isqje3sjjq44s5yzjn3duqa4q2l2zf5zsi number_of_agents: 1 deployment: agent: diff --git a/packages/valory/services/trader_pearl/service.yaml b/packages/valory/services/trader_pearl/service.yaml index a3b33558da..6cc00df2af 100644 --- a/packages/valory/services/trader_pearl/service.yaml +++ b/packages/valory/services/trader_pearl/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeibg7bdqpioh4lmvknw3ygnllfku32oca4eq5pqtvdrdsgw6buko7e fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeigeanhy3texx7mpnedcdaknwyzo4abf3w6eo2cix33piuflk5vg6u +agent: valory/trader:0.1.0:bafybeigotorqhbdig74qvmj2isqje3sjjq44s5yzjn3duqa4q2l2zf5zsi number_of_agents: 1 deployment: agent: diff --git a/packages/valory/skills/decision_maker_abci/skill.yaml b/packages/valory/skills/decision_maker_abci/skill.yaml index 517f03fe55..11baf63f38 100644 --- a/packages/valory/skills/decision_maker_abci/skill.yaml +++ b/packages/valory/skills/decision_maker_abci/skill.yaml @@ -93,7 +93,7 @@ fingerprint: tests/behaviours/test_check_benchmarking.py: bafybeihfdlrjliykbuwfqsv3snkgzge3jfug3dezp7uan5qooufoevtbnq tests/behaviours/test_decision_receive.py: bafybeicslgo66uln6su5cz4td54rgwyegbvna2gr6h5lg33mlusu2bl6v4 tests/behaviours/test_decision_request.py: bafybeiacd7ji65apfapxongatdljsne6kl3q3sgmzgkgihtevgz5hfppky - tests/behaviours/test_handle_failed_tx.py: bafybeift5shvfizbmqeggd2vhpm254wtnx62bydr6pgj6zyirmapef4ugq + tests/behaviours/test_handle_failed_tx.py: bafybeiavjzys3tl56ognlm23t6zqo4ckb5xwyurwqqxgqj6xbtggozwezy tests/behaviours/test_omen_withdrawal_store.py: bafybeia6oof3z4v5vy4gewcnu5yidmfyew47mln5nv4bridoukhyyt2zcq tests/behaviours/test_polymarket_bet_placement.py: bafybeicrhoobbkav3xhrmlrfodzhjrscdpfux6o334uamavut2pnnkfazq tests/behaviours/test_polymarket_dw_behaviours_extra.py: bafybeihgndegqjnrnrbpm767jfm6facokhrb5dncpzqlwqcodyjdelnvoi diff --git a/packages/valory/skills/decision_maker_abci/tests/behaviours/test_handle_failed_tx.py b/packages/valory/skills/decision_maker_abci/tests/behaviours/test_handle_failed_tx.py index 18180ae57d..f5feedcf51 100644 --- a/packages/valory/skills/decision_maker_abci/tests/behaviours/test_handle_failed_tx.py +++ b/packages/valory/skills/decision_maker_abci/tests/behaviours/test_handle_failed_tx.py @@ -137,8 +137,7 @@ def test_payload_has_handle_failed_tx_submitter(self) -> None: assert payload.tx_submitter == HandleFailedTxRound.auto_round_id() def test_offchain_deposit_sentinel_treated_as_mech_timeout(self) -> None: - """The off-chain deposit sentinel must produce the same bookkeeping as - an on-chain mech timeout. + """The off-chain deposit sentinel must produce the same bookkeeping as an on-chain mech timeout. Without this branch the off-chain failure path leaves ``shared_state.mech_timed_out`` False and diff --git a/packages/valory/skills/trader_abci/skill.yaml b/packages/valory/skills/trader_abci/skill.yaml index 12971a1557..3a7333ac0a 100644 --- a/packages/valory/skills/trader_abci/skill.yaml +++ b/packages/valory/skills/trader_abci/skill.yaml @@ -57,8 +57,8 @@ skills: - valory/transaction_settlement_abci:0.1.0:bafybeibv3tycpdhphlblu62zpcbjsj7hnwkutexxqagorkelhjlt4t4fii - valory/termination_abci:0.1.0:bafybeibnnzry5kknci3z46gcjgutv4jid3ir6xn6a5adq3tx6v2e25augq - valory/market_manager_abci:0.1.0:bafybeic67hypwetzltnuy3a6y3o2o332lxyvn34buq57gy4n6bfqpbpxjm -- valory/decision_maker_abci:0.1.0:bafybeiblakfjutvn2ambiklxccxoe3wuuk7ul3rytjonj3slqsks2jswsu -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeidu6cxgtbxp7fix2giljdezb5rppwwj4ppf533fuw2ggbnpsyn4di +- valory/decision_maker_abci:0.1.0:bafybeiebddoshz7szs22sm7fn2cb4ywb6oa46ohc2naqcoznggb3nde43u +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeighlmd4xj64qf3xtgbcxvqnipcnsvv47npkrlatngan2e6r23elhm - valory/staking_abci:0.1.0:bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq - valory/check_stop_trading_abci:0.1.0:bafybeiexmdtj3qfjnhh2sy3fa4hwxkvqogsy7u46liobzhgilzogeoezeu - valory/mech_interact_abci:0.1.0:bafybeihhwzpa6x5ypth426tzd2zjsnys6jmjaab4zvk4edisetzktft754 diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml index baad2e240c..0df86464de 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml @@ -27,7 +27,7 @@ protocols: - valory/ledger_api:1.0.0:bafybeiecq56phjfws36rgrefw6niyo4ezesloodsfis647mpm5ygqo4ysi skills: - valory/abstract_round_abci:0.1.0:bafybeicioxhbhnsoqyqvkeevd7df7r2vubbiglyf7ucps2el73objazjsq -- valory/decision_maker_abci:0.1.0:bafybeiblakfjutvn2ambiklxccxoe3wuuk7ul3rytjonj3slqsks2jswsu +- valory/decision_maker_abci:0.1.0:bafybeiebddoshz7szs22sm7fn2cb4ywb6oa46ohc2naqcoznggb3nde43u - valory/staking_abci:0.1.0:bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq - valory/mech_interact_abci:0.1.0:bafybeihhwzpa6x5ypth426tzd2zjsnys6jmjaab4zvk4edisetzktft754 behaviours: From 0956931025134619c3676ff9bbed0e0c8c80a2e3 Mon Sep 17 00:00:00 2001 From: DivyaNautiyal07 Date: Wed, 1 Jul 2026 18:23:02 +0530 Subject: [PATCH 4/4] fix(offchain): polymarket_trader parity + bare-dev cap default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two review findings from OjusWiZard's second pass: 1. [Important] ``polymarket_trader/service.yaml`` was missing the 7 off-chain keys in the ``MECH_MARKETPLACE_CONFIG`` env-default dict — the parity claim in the PR description didn't hold for that service. Added them alongside the polymarket_trader-appropriate cap (``5000000`` = 5 USDC at 6 decimals, matching its existing payment token). 2. [Advisory] ``trader_abci/skill.yaml`` default ``auto_deposit_cap_per_cycle`` was ``5000000``, which is dust (~5e-12 xDAI) at the Gnosis native denomination the skill.yaml default is intended for. Bumped to ``5000000000000000000`` (5 xDAI at 18 decimals, matching ``trader_pearl``) and added a decimals comment explaining that polymarket_trader overrides to 6-decimal USDC via service.yaml. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/packages.json | 8 ++++---- packages/valory/agents/trader/aea-config.yaml | 2 +- packages/valory/services/polymarket_trader/service.yaml | 4 ++-- packages/valory/services/trader_pearl/service.yaml | 2 +- packages/valory/skills/trader_abci/skill.yaml | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/packages.json b/packages/packages.json index 1925e3b7dc..6b0b4ffc0d 100644 --- a/packages/packages.json +++ b/packages/packages.json @@ -10,15 +10,15 @@ "connection/valory/polymarket_client/0.1.0": "bafybeid4eo37pka4tfhsjs6rb3knrugmokcvihust2dpfrgob56y77xd44", "skill/valory/market_manager_abci/0.1.0": "bafybeic67hypwetzltnuy3a6y3o2o332lxyvn34buq57gy4n6bfqpbpxjm", "skill/valory/decision_maker_abci/0.1.0": "bafybeiebddoshz7szs22sm7fn2cb4ywb6oa46ohc2naqcoznggb3nde43u", - "skill/valory/trader_abci/0.1.0": "bafybeih2msftg5u3nxz5pwxj4ei7e6txvy2xtjizcedeuqtvii2dhjis2y", + "skill/valory/trader_abci/0.1.0": "bafybeigkd4zkooaeng7ujroqpletfslja23fn6e6x4zuneictevpgeqw7y", "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeighlmd4xj64qf3xtgbcxvqnipcnsvv47npkrlatngan2e6r23elhm", "skill/valory/staking_abci/0.1.0": "bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq", "skill/valory/agent_performance_summary_abci/0.1.0": "bafybeigmmvpncem6i6t57nwjqzajrbnf6rnqgp43mlo6jf6uziq6lrhlca", "skill/valory/check_stop_trading_abci/0.1.0": "bafybeiexmdtj3qfjnhh2sy3fa4hwxkvqogsy7u46liobzhgilzogeoezeu", "skill/valory/chatui_abci/0.1.0": "bafybeie2kmgihgk3rwpzelaa76ypvchsyg2vy3me4vxlbjttaq4frs3ipa", - "agent/valory/trader/0.1.0": "bafybeigotorqhbdig74qvmj2isqje3sjjq44s5yzjn3duqa4q2l2zf5zsi", - "service/valory/trader_pearl/0.1.0": "bafybeih3axeacmuluwrhktlpigh4fvu5xxwjwntreha6jc6ta464b77mnm", - "service/valory/polymarket_trader/0.1.0": "bafybeigdahvrxg4xl557afubw6byzq6spvsae72gzyewkibf4o3wocmmlq" + "agent/valory/trader/0.1.0": "bafybeievk35g3mszasfdeuumig63wqir2h27g6kqmaw4f4vrvg7cvar5ya", + "service/valory/trader_pearl/0.1.0": "bafybeiahpvkxhi7bdpdrl25ndzlcfnm4x6r4ot5ops3wpdza5562poweiu", + "service/valory/polymarket_trader/0.1.0": "bafybeidq7gsdnapl74xlplw27x4a3kq7cuqsxwv3aphfq54jlnzfb7chyq" }, "third_party": { "protocol/valory/acn_data_share/0.1.0": "bafybeieqisfr6lhaaesq37lk7vyaxza2h6nucshksgyo2djqfyf2saqo4i", diff --git a/packages/valory/agents/trader/aea-config.yaml b/packages/valory/agents/trader/aea-config.yaml index b8c30961f1..440d7052c2 100644 --- a/packages/valory/agents/trader/aea-config.yaml +++ b/packages/valory/agents/trader/aea-config.yaml @@ -72,7 +72,7 @@ skills: - valory/tx_settlement_multiplexer_abci:0.1.0:bafybeighlmd4xj64qf3xtgbcxvqnipcnsvv47npkrlatngan2e6r23elhm - valory/market_manager_abci:0.1.0:bafybeic67hypwetzltnuy3a6y3o2o332lxyvn34buq57gy4n6bfqpbpxjm - valory/decision_maker_abci:0.1.0:bafybeiebddoshz7szs22sm7fn2cb4ywb6oa46ohc2naqcoznggb3nde43u -- valory/trader_abci:0.1.0:bafybeih2msftg5u3nxz5pwxj4ei7e6txvy2xtjizcedeuqtvii2dhjis2y +- valory/trader_abci:0.1.0:bafybeigkd4zkooaeng7ujroqpletfslja23fn6e6x4zuneictevpgeqw7y - valory/staking_abci:0.1.0:bafybeihwyron2bv7ierrgxke7xofwjy7x6wtglg5vopon7i7lfdiivweaq - valory/check_stop_trading_abci:0.1.0:bafybeiexmdtj3qfjnhh2sy3fa4hwxkvqogsy7u46liobzhgilzogeoezeu - valory/mech_interact_abci:0.1.0:bafybeihhwzpa6x5ypth426tzd2zjsnys6jmjaab4zvk4edisetzktft754 diff --git a/packages/valory/services/polymarket_trader/service.yaml b/packages/valory/services/polymarket_trader/service.yaml index 6912f8d735..2b9cf2297a 100644 --- a/packages/valory/services/polymarket_trader/service.yaml +++ b/packages/valory/services/polymarket_trader/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeichoh5tnk4qctaazcjcrxvpwc5yasodleqoeapnfapwrrdh3tm5gu fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeigotorqhbdig74qvmj2isqje3sjjq44s5yzjn3duqa4q2l2zf5zsi +agent: valory/trader:0.1.0:bafybeievk35g3mszasfdeuumig63wqir2h27g6kqmaw4f4vrvg7cvar5ya number_of_agents: 1 deployment: agent: @@ -137,7 +137,7 @@ models: strategies_kwargs: ${STRATEGIES_KWARGS:dict:{"floor_balance":0,"default_max_bet_size":2500000,"absolute_min_bet_size":1000000,"absolute_max_bet_size":2500000,"n_bets":1,"min_edge":0.01,"max_edge":0.15,"min_oracle_prob":0.1,"fee_per_trade":10000,"grid_points":500}} use_subgraph_for_redeeming: ${USE_SUBGRAPH_FOR_REDEEMING:bool:true} use_mech_marketplace: ${USE_MECH_MARKETPLACE:bool:true} - mech_marketplace_config: ${MECH_MARKETPLACE_CONFIG:dict:{"mech_marketplace_address":"0x343F2B005cF6D70bA610CD9F1F1927049414B582","priority_mech_address":"0x1DCbC9368327776F8B20Dc041D40b8076C8AC173","priority_mech_staking_instance_address":"0x0000000000000000000000000000000000000000","priority_mech_service_id":25,"requester_staking_instance_address":"0x0000000000000000000000000000000000000000","response_timeout":300}} + mech_marketplace_config: ${MECH_MARKETPLACE_CONFIG:dict:{"mech_marketplace_address":"0x343F2B005cF6D70bA610CD9F1F1927049414B582","priority_mech_address":"0x1DCbC9368327776F8B20Dc041D40b8076C8AC173","priority_mech_staking_instance_address":"0x0000000000000000000000000000000000000000","priority_mech_service_id":25,"requester_staking_instance_address":"0x0000000000000000000000000000000000000000","response_timeout":300,"use_dynamic_mech_selection":false,"use_offchain":false,"offchain_url":null,"offchain_deposit_target_calls":10,"auto_deposit_cap_per_cycle":5000000,"offchain_poll_interval_seconds":3.0,"offchain_poll_timeout_seconds":300.0,"offchain_failover_max_retries":2}} service_endpoint: ${SERVICE_ENDPOINT:str:https://trader.autonolas.tech/} rpc_sleep_time: ${RPC_SLEEP_TIME:int:10} safe_voting_range: ${SAFE_VOTING_RANGE:int:600} diff --git a/packages/valory/services/trader_pearl/service.yaml b/packages/valory/services/trader_pearl/service.yaml index 6cc00df2af..e29e738c5f 100644 --- a/packages/valory/services/trader_pearl/service.yaml +++ b/packages/valory/services/trader_pearl/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeibg7bdqpioh4lmvknw3ygnllfku32oca4eq5pqtvdrdsgw6buko7e fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeigotorqhbdig74qvmj2isqje3sjjq44s5yzjn3duqa4q2l2zf5zsi +agent: valory/trader:0.1.0:bafybeievk35g3mszasfdeuumig63wqir2h27g6kqmaw4f4vrvg7cvar5ya number_of_agents: 1 deployment: agent: diff --git a/packages/valory/skills/trader_abci/skill.yaml b/packages/valory/skills/trader_abci/skill.yaml index 3a7333ac0a..d0bd60095b 100644 --- a/packages/valory/skills/trader_abci/skill.yaml +++ b/packages/valory/skills/trader_abci/skill.yaml @@ -304,7 +304,7 @@ models: use_offchain: false offchain_url: null offchain_deposit_target_calls: 10 - auto_deposit_cap_per_cycle: 5000000 + auto_deposit_cap_per_cycle: 5000000000000000000 offchain_poll_interval_seconds: 3.0 offchain_poll_timeout_seconds: 300.0 offchain_failover_max_retries: 2