# flake8: noqa
# fmt: off
# mypy: disable-error-code="no-any-return, no-untyped-call, misc, type-arg"
# This file was automatically generated by algokit-client-generator.
# DO NOT MODIFY IT BY HAND.
# requires: algokit-utils@^1.2.0
import base64
import dataclasses
import decimal
import typing
from abc import ABC, abstractmethod

import algokit_utils
import algosdk
from algosdk.v2client import models
from algosdk.atomic_transaction_composer import (
    AtomicTransactionComposer,
    AtomicTransactionResponse,
    SimulateAtomicTransactionResponse,
    TransactionSigner,
    TransactionWithSigner
)

_APP_SPEC_JSON = r"""{
    "hints": {
        "noticeboard_deploy(uint64)uint64": {
            "call_config": {
                "no_op": "CREATE"
            }
        },
        "noticeboard_migrate(uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "noticeboard_set(account,byte[32],(uint64,uint64,uint64,uint64),(uint64,uint64,uint64,uint64),(uint64),(uint64,uint64))void": {
            "structs": {
                "noticeboard_fees": {
                    "name": "NoticeboardFees",
                    "elements": [
                        [
                            "val_user_reg",
                            "uint64"
                        ],
                        [
                            "del_user_reg",
                            "uint64"
                        ],
                        [
                            "val_ad_creation",
                            "uint64"
                        ],
                        [
                            "del_contract_creation",
                            "uint64"
                        ]
                    ]
                },
                "noticeboard_terms_timing": {
                    "name": "NoticeboardTermsTiming",
                    "elements": [
                        [
                            "rounds_duration_min_min",
                            "uint64"
                        ],
                        [
                            "rounds_duration_max_max",
                            "uint64"
                        ],
                        [
                            "before_expiry",
                            "uint64"
                        ],
                        [
                            "report_period",
                            "uint64"
                        ]
                    ]
                },
                "noticeboard_terms_pricing": {
                    "name": "NoticeboardTermsPricing",
                    "elements": [
                        [
                            "commission_min",
                            "uint64"
                        ]
                    ]
                },
                "noticeboard_terms_node": {
                    "name": "NoticeboardTermsNodeLimits",
                    "elements": [
                        [
                            "stake_max_max",
                            "uint64"
                        ],
                        [
                            "cnt_del_max_max",
                            "uint64"
                        ]
                    ]
                }
            },
            "call_config": {
                "no_op": "CALL"
            }
        },
        "noticeboard_key_reg((uint64,uint64,uint64,byte[32],byte[32],byte[64],address),pay)void": {
            "structs": {
                "key_reg_info": {
                    "name": "KeyRegTxnInfo",
                    "elements": [
                        [
                            "vote_first",
                            "uint64"
                        ],
                        [
                            "vote_last",
                            "uint64"
                        ],
                        [
                            "vote_key_dilution",
                            "uint64"
                        ],
                        [
                            "vote_pk",
                            "byte[32]"
                        ],
                        [
                            "selection_pk",
                            "byte[32]"
                        ],
                        [
                            "state_proof_pk",
                            "byte[64]"
                        ],
                        [
                            "sender",
                            "address"
                        ]
                    ]
                }
            },
            "call_config": {
                "no_op": "CALL"
            }
        },
        "noticeboard_optin_asa(asset,account,pay)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "noticeboard_config_asset(uint64,(bool,uint64,uint64,uint64),pay)void": {
            "structs": {
                "asset_info": {
                    "name": "NoticeboardAssetInfo",
                    "elements": [
                        [
                            "accepted",
                            "bool"
                        ],
                        [
                            "fee_round_min_min",
                            "uint64"
                        ],
                        [
                            "fee_round_var_min",
                            "uint64"
                        ],
                        [
                            "fee_setup_min",
                            "uint64"
                        ]
                    ]
                }
            },
            "call_config": {
                "no_op": "CALL"
            }
        },
        "noticeboard_income(uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "template_load_init(byte,uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "template_load_data(byte,uint64,byte[])void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "partner_config(address,uint64,bool,pay)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "gas()void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "user_create(byte[4],pay)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "user_delete()void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "ad_create(uint64,pay)uint64": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "ad_config(application,uint64,address,bool,uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "ad_delete(application,uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "ad_ready(address,application,uint64,bool)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "ad_self_disclose(application,uint64,(byte[30],byte[60],byte[2],uint64,byte[20]))void": {
            "structs": {
                "val_info": {
                    "name": "ValidatorSelfDisclosure",
                    "elements": [
                        [
                            "name",
                            "byte[30]"
                        ],
                        [
                            "https",
                            "byte[60]"
                        ],
                        [
                            "country_code",
                            "byte[2]"
                        ],
                        [
                            "hw_cat",
                            "uint64"
                        ],
                        [
                            "node_version",
                            "byte[20]"
                        ]
                    ]
                }
            },
            "call_config": {
                "no_op": "CALL"
            }
        },
        "ad_terms(application,uint64,byte[32],(uint64,uint64,uint64,uint64,uint64),(uint64,uint64,uint64,uint64,uint64),(uint64,uint64),((uint64,uint64)[2]),(uint64,uint64),uint64,pay)void": {
            "structs": {
                "terms_time": {
                    "name": "ValidatorTermsTiming",
                    "elements": [
                        [
                            "rounds_setup",
                            "uint64"
                        ],
                        [
                            "rounds_confirm",
                            "uint64"
                        ],
                        [
                            "rounds_duration_min",
                            "uint64"
                        ],
                        [
                            "rounds_duration_max",
                            "uint64"
                        ],
                        [
                            "round_max_end",
                            "uint64"
                        ]
                    ]
                },
                "terms_price": {
                    "name": "ValidatorTermsPricing",
                    "elements": [
                        [
                            "commission",
                            "uint64"
                        ],
                        [
                            "fee_round_min",
                            "uint64"
                        ],
                        [
                            "fee_round_var",
                            "uint64"
                        ],
                        [
                            "fee_setup",
                            "uint64"
                        ],
                        [
                            "fee_asset_id",
                            "uint64"
                        ]
                    ]
                },
                "terms_stake": {
                    "name": "ValidatorTermsStakeLimits",
                    "elements": [
                        [
                            "stake_max",
                            "uint64"
                        ],
                        [
                            "stake_gratis",
                            "uint64"
                        ]
                    ]
                },
                "terms_reqs": {
                    "name": "ValidatorTermsGating",
                    "elements": [
                        [
                            "gating_asa_list",
                            "(uint64,uint64)[2]"
                        ]
                    ]
                },
                "terms_warn": {
                    "name": "ValidatorTermsWarnings",
                    "elements": [
                        [
                            "cnt_warning_max",
                            "uint64"
                        ],
                        [
                            "rounds_warning",
                            "uint64"
                        ]
                    ]
                }
            },
            "call_config": {
                "no_op": "CALL"
            }
        },
        "ad_income(application,uint64,uint64)uint64": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "ad_asa_close(application,uint64,uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "contract_create(address,uint64,uint64,address,application,uint64,uint64,byte[32],address,pay,txn)uint64": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "keys_confirm(application,uint64,address,application,uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "keys_not_confirmed(address,application,uint64,address,application,uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "keys_not_submitted(address,application,uint64,address,application,uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "keys_submit(address,application,uint64,address,application,uint64,(uint64,uint64,uint64,byte[32],byte[32],byte[64],address))void": {
            "structs": {
                "key_reg_txn_info": {
                    "name": "KeyRegTxnInfo",
                    "elements": [
                        [
                            "vote_first",
                            "uint64"
                        ],
                        [
                            "vote_last",
                            "uint64"
                        ],
                        [
                            "vote_key_dilution",
                            "uint64"
                        ],
                        [
                            "vote_pk",
                            "byte[32]"
                        ],
                        [
                            "selection_pk",
                            "byte[32]"
                        ],
                        [
                            "state_proof_pk",
                            "byte[64]"
                        ],
                        [
                            "sender",
                            "address"
                        ]
                    ]
                }
            },
            "call_config": {
                "no_op": "CALL"
            }
        },
        "breach_limits(address,application,uint64,address,application,uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "breach_pay(address,application,uint64,address,application,uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "breach_suspended(address,application,uint64,address,application,uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "contract_claim(address,application,uint64,address,application,uint64)(uint64,uint64,uint64)": {
            "structs": {
                "output": {
                    "name": "EarningsDistribution",
                    "elements": [
                        [
                            "user",
                            "uint64"
                        ],
                        [
                            "platform",
                            "uint64"
                        ],
                        [
                            "asset_id",
                            "uint64"
                        ]
                    ]
                }
            },
            "call_config": {
                "no_op": "CALL"
            }
        },
        "contract_expired(address,application,uint64,address,application,uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "contract_withdraw(application,uint64,address,application,uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "contract_delete(application,uint64,address,application,uint64)(uint64,uint64)": {
            "structs": {
                "output": {
                    "name": "ContractDeleteReturn",
                    "elements": [
                        [
                            "remaining_balance",
                            "uint64"
                        ],
                        [
                            "asset_id",
                            "uint64"
                        ]
                    ]
                }
            },
            "call_config": {
                "no_op": "CALL"
            }
        },
        "contract_report_expiry_soon(address,application,uint64,address,application,uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "get_noticeboard_asset(uint64)(bool,uint64,uint64,uint64)": {
            "read_only": true,
            "structs": {
                "output": {
                    "name": "NoticeboardAssetInfo",
                    "elements": [
                        [
                            "accepted",
                            "bool"
                        ],
                        [
                            "fee_round_min_min",
                            "uint64"
                        ],
                        [
                            "fee_round_var_min",
                            "uint64"
                        ],
                        [
                            "fee_setup_min",
                            "uint64"
                        ]
                    ]
                }
            },
            "call_config": {
                "no_op": "CALL"
            }
        },
        "get_noticeboard_user(address)(byte[4],byte[8],address,address,uint64[110],uint64)": {
            "read_only": true,
            "structs": {
                "output": {
                    "name": "UserInfo",
                    "elements": [
                        [
                            "role",
                            "byte[4]"
                        ],
                        [
                            "dll_name",
                            "byte[8]"
                        ],
                        [
                            "prev_user",
                            "address"
                        ],
                        [
                            "next_user",
                            "address"
                        ],
                        [
                            "app_ids",
                            "uint64[110]"
                        ],
                        [
                            "cnt_app_ids",
                            "uint64"
                        ]
                    ]
                }
            },
            "call_config": {
                "no_op": "CALL"
            }
        }
    },
    "source": {
        "approval": " ",
        "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCgpzbWFydF9jb250cmFjdHMubm90aWNlYm9hcmQuY29udHJhY3QuTm90aWNlYm9hcmQuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
    },
    "state": {
        "global": {
            "num_byte_slices": 9,
            "num_uints": 2
        },
        "local": {
            "num_byte_slices": 0,
            "num_uints": 0
        }
    },
    "schema": {
        "global": {
            "declared": {
                "app_id_new": {
                    "type": "uint64",
                    "key": "app_id_new"
                },
                "app_id_old": {
                    "type": "uint64",
                    "key": "app_id_old"
                },
                "dll_del": {
                    "type": "bytes",
                    "key": "dll__del"
                },
                "dll_val": {
                    "type": "bytes",
                    "key": "dll__val"
                },
                "noticeboard_fees": {
                    "type": "bytes",
                    "key": "noticeboard_fees"
                },
                "noticeboard_terms_node": {
                    "type": "bytes",
                    "key": "noticeboard_terms_node"
                },
                "noticeboard_terms_pricing": {
                    "type": "bytes",
                    "key": "noticeboard_terms_pricing"
                },
                "noticeboard_terms_timing": {
                    "type": "bytes",
                    "key": "noticeboard_terms_timing"
                },
                "pla_manager": {
                    "type": "bytes",
                    "key": "pla_manager"
                },
                "state": {
                    "type": "bytes",
                    "key": "state"
                },
                "tc_sha256": {
                    "type": "bytes",
                    "key": "tc_sha256"
                }
            },
            "reserved": {}
        },
        "local": {
            "declared": {},
            "reserved": {}
        }
    },
    "contract": {
        "name": "Noticeboard",
        "methods": [
            {
                "name": "noticeboard_deploy",
                "args": [
                    {
                        "type": "uint64",
                        "name": "app_id_old",
                        "desc": "The app ID of previous version of the platform."
                    }
                ],
                "returns": {
                    "type": "uint64",
                    "desc": "App ID of the created noticeboard application."
                },
                "desc": "Creates a new Noticeboard."
            },
            {
                "name": "noticeboard_migrate",
                "args": [
                    {
                        "type": "uint64",
                        "name": "app_id_new",
                        "desc": "The app ID of next version of the platform."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Retires the current platform, preventing creation of new validator ads and modification of existing ones,\nas well as creation of new delegation contracts and updating of existing ones. Since retired platform cannot create new validator ads or modify existing ones, adding or removing an ASA is not needed anymore."
            },
            {
                "name": "noticeboard_set",
                "args": [
                    {
                        "type": "account",
                        "name": "pla_manager",
                        "desc": "Platform manager account."
                    },
                    {
                        "type": "byte[32]",
                        "name": "tc_sha256",
                        "desc": "Hash (i.e. SHA 256) of the template of delegation contract concluded between the delegator and validator. This includes the Terms and Conditions. The template has placeholders corresponding to variable names of contract terms defined in this structure."
                    },
                    {
                        "type": "(uint64,uint64,uint64,uint64)",
                        "name": "noticeboard_fees",
                        "desc": "Fees charged by the noticeboard."
                    },
                    {
                        "type": "(uint64,uint64,uint64,uint64)",
                        "name": "noticeboard_terms_timing",
                        "desc": "Noticeboard limits on timing terms for validator ads."
                    },
                    {
                        "type": "(uint64)",
                        "name": "noticeboard_terms_pricing",
                        "desc": "Noticeboard limits on pricing terms for validator ads."
                    },
                    {
                        "type": "(uint64,uint64)",
                        "name": "noticeboard_terms_node",
                        "desc": "Noticeboard limits on node and related stake limit terms for validator ads."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Set (anew) all of the platform's operating parameters."
            },
            {
                "name": "noticeboard_key_reg",
                "args": [
                    {
                        "type": "(uint64,uint64,uint64,byte[32],byte[32],byte[64],address)",
                        "name": "key_reg_info",
                        "desc": "Key registration information to send."
                    },
                    {
                        "type": "pay",
                        "name": "txn",
                        "desc": "Payment transaction to cover costs for the key (de)registration fee."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Issues a key (de)registration transaction by the platform."
            },
            {
                "name": "noticeboard_optin_asa",
                "args": [
                    {
                        "type": "asset",
                        "name": "asa",
                        "desc": "Asset to opt into."
                    },
                    {
                        "type": "account",
                        "name": "sender",
                        "desc": "Account to opt into the asa."
                    },
                    {
                        "type": "pay",
                        "name": "txn",
                        "desc": "Payment transaction to cover MBR increase."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Opts the platform address in to an ASA."
            },
            {
                "name": "noticeboard_config_asset",
                "args": [
                    {
                        "type": "uint64",
                        "name": "asset_id",
                        "desc": "ID of asset to add or modify as an accepted payment method, i.e. ASA ID or 0 for ALGO."
                    },
                    {
                        "type": "(bool,uint64,uint64,uint64)",
                        "name": "asset_info",
                        "desc": "Information about the payment asset, i.e. if it is accepted as a payment at the platform (True) or not (False), and its minimum pricing limits."
                    },
                    {
                        "type": "pay",
                        "name": "txn",
                        "desc": "Payment transaction to cover (potential) MBR increase."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Adds or modifies an asset from the accepted payment methods."
            },
            {
                "name": "noticeboard_income",
                "args": [
                    {
                        "type": "uint64",
                        "name": "asset_id",
                        "desc": "ID of asset to withdraw all earnings."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Sends all platform earnings of asset to platform manager account."
            },
            {
                "name": "template_load_init",
                "args": [
                    {
                        "type": "byte",
                        "name": "name",
                        "desc": "Name of the box with the contract template."
                    },
                    {
                        "type": "uint64",
                        "name": "template_size",
                        "desc": "Size of the delegator contract template in bytes."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Starts the process of uploading a contract template."
            },
            {
                "name": "template_load_data",
                "args": [
                    {
                        "type": "byte",
                        "name": "name",
                        "desc": "Name of the box with the contract template."
                    },
                    {
                        "type": "uint64",
                        "name": "offset",
                        "desc": "Offset in the box at which to replace the data."
                    },
                    {
                        "type": "byte[]",
                        "name": "data",
                        "desc": "Data to replace in the box at the defined position."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Uploads a data chunk to a contract template."
            },
            {
                "name": "partner_config",
                "args": [
                    {
                        "type": "address",
                        "name": "partner_address",
                        "desc": "Address of the partner to register on the platform."
                    },
                    {
                        "type": "uint64",
                        "name": "partner_commission",
                        "desc": "Partner's convenience fee, i.e. relative commission, charged on top of validator price for partner's convenience offer. The value is represented in ppm."
                    },
                    {
                        "type": "bool",
                        "name": "partner_delete",
                        "desc": "Boolean set to true to delete the partner from the platform, otherwise create or modify it."
                    },
                    {
                        "type": "pay",
                        "name": "txn",
                        "desc": "Payment transaction to cover (potential) MBR increase."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Creates or modifies a platform's partner."
            },
            {
                "name": "gas",
                "args": [],
                "returns": {
                    "type": "void"
                },
                "desc": "To fit more resources in app reference arrays."
            },
            {
                "name": "user_create",
                "args": [
                    {
                        "type": "byte[4]",
                        "name": "user_role",
                        "desc": "Role to requested by the user. Possible options:     ROLE_VAL - user is a validator.     ROLE_DEL - user is a delegator."
                    },
                    {
                        "type": "pay",
                        "name": "txn",
                        "desc": "Payment transaction to cover MBR increase and user creation fee."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Creates a new user data structure for the sender depending on the requested user role."
            },
            {
                "name": "user_delete",
                "args": [],
                "returns": {
                    "type": "void"
                },
                "desc": "Clears the user's existing role on noticeboard."
            },
            {
                "name": "ad_create",
                "args": [
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index in the validator owner app list at which to place the newly created validator ad. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "pay",
                        "name": "txn",
                        "desc": "Transaction for the payment of the validator ad creation fee and all the MBR increases at Noticeboard and the newly created ValidatorAd."
                    }
                ],
                "returns": {
                    "type": "uint64",
                    "desc": "App ID of the created validator ad application."
                },
                "desc": "Creates a new validator ad for the sender (i.e. validator owner)."
            },
            {
                "name": "ad_config",
                "args": [
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "address",
                        "name": "val_manager",
                        "desc": "Manager address for the validator ad."
                    },
                    {
                        "type": "bool",
                        "name": "live",
                        "desc": "Set to True if the newly created validator ad should be accepting new delegators right away, otherwise set to False."
                    },
                    {
                        "type": "uint64",
                        "name": "cnt_del_max",
                        "desc": "Maximum number of delegators the validator is willing to manage simultaneously."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Sets all operation configuration parameters for the validator ad, i.e.\nthe validator manager account, the status whether the ad is live to accept new delegators (`live=True`) or not (`live=False`), and the maximum number of delegators the validator ad can accept."
            },
            {
                "name": "ad_delete",
                "args": [
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Validator owner deletes a validator ad.\nPossible only if there are no active delegators and all balances have been claimed."
            },
            {
                "name": "ad_ready",
                "args": [
                    {
                        "type": "address",
                        "name": "val_owner",
                        "desc": "Owner address for the validator ad."
                    },
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "bool",
                        "name": "ready",
                        "desc": "Set to True if validator manager is ready for accepting new delegators, otherwise set to False."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Ad manager sets its readiness for operation."
            },
            {
                "name": "ad_self_disclose",
                "args": [
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "(byte[30],byte[60],byte[2],uint64,byte[20])",
                        "name": "val_info",
                        "desc": "Self-disclosed information about the validator."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Ad owner sets its self-disclosure information."
            },
            {
                "name": "ad_terms",
                "args": [
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "byte[32]",
                        "name": "tc_sha256",
                        "desc": "Hash (i.e. SHA 256) of the Terms and Conditions agreed by the validator."
                    },
                    {
                        "type": "(uint64,uint64,uint64,uint64,uint64)",
                        "name": "terms_time",
                        "desc": "Validator's terms about timing."
                    },
                    {
                        "type": "(uint64,uint64,uint64,uint64,uint64)",
                        "name": "terms_price",
                        "desc": "Validator's terms about pricing."
                    },
                    {
                        "type": "(uint64,uint64)",
                        "name": "terms_stake",
                        "desc": "Validator's terms about stake limits."
                    },
                    {
                        "type": "((uint64,uint64)[2])",
                        "name": "terms_reqs",
                        "desc": "Validator's terms about gating requirements."
                    },
                    {
                        "type": "(uint64,uint64)",
                        "name": "terms_warn",
                        "desc": "Validator's terms about warnings."
                    },
                    {
                        "type": "uint64",
                        "name": "mbr_delegator_template_box",
                        "desc": "Amount needed to pay to the validator ad for creating box for delegator template."
                    },
                    {
                        "type": "pay",
                        "name": "txn",
                        "desc": "Transaction for the payment of potential MBR increase of ValidatorAd in case of ASA opt-in and payment of box for delegator contract template box in case the ValidatorAd is in STATE_CREATED."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Sets all the terms for creating a delegation contract.\nWith this action, the validator agrees with the (new) terms."
            },
            {
                "name": "ad_income",
                "args": [
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "uint64",
                        "name": "asset_id",
                        "desc": "ID of the asset (i.e. ASA ID or 0 for ALGO) for which the owner would like to withdraw all earnings from the validator ad."
                    }
                ],
                "returns": {
                    "type": "uint64",
                    "desc": "Withdrawn income from the validator ad for the input asset."
                },
                "desc": "Validator owner withdraws all available balance from the validator ad for the given asset."
            },
            {
                "name": "ad_asa_close",
                "args": [
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "uint64",
                        "name": "asset_id",
                        "desc": "ID of the asset (i.e. ASA ID or 0 for ALGO) for which the owner would like to withdraw all earnings from the validator ad."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Removes the asset's storage on the validator ad."
            },
            {
                "name": "contract_create",
                "args": [
                    {
                        "type": "address",
                        "name": "del_beneficiary",
                        "desc": "Beneficiary address for the new delegation contract."
                    },
                    {
                        "type": "uint64",
                        "name": "rounds_duration",
                        "desc": "Contract duration in number of rounds."
                    },
                    {
                        "type": "uint64",
                        "name": "stake_max",
                        "desc": "The maximum amount of ALGO that the delegator beneficiary address intends to have at any point in time during the contract duration."
                    },
                    {
                        "type": "address",
                        "name": "val_owner",
                        "desc": "Owner address for the validator ad."
                    },
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "uint64",
                        "name": "del_app_idx",
                        "desc": "Index of the delegator manager app list at which to store the new delegator contract. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "byte[32]",
                        "name": "tc_sha256",
                        "desc": "Hash (i.e. SHA 256) of the Terms and Conditions agreed by the delegator."
                    },
                    {
                        "type": "address",
                        "name": "partner_address",
                        "desc": "Address of the partner that facilitated the contract creation. If there is no partner, set to Global.zero_address."
                    },
                    {
                        "type": "pay",
                        "name": "mbr_txn",
                        "desc": "Payment transaction for the payment of the increase of validator ad MBR due to creation of a new contract and payment of delegator contract creation fee."
                    },
                    {
                        "type": "txn",
                        "name": "txn",
                        "desc": "Transaction for the payment of the setup and operational fee."
                    }
                ],
                "returns": {
                    "type": "uint64",
                    "desc": "App ID of the created delegator contract application."
                },
                "desc": "Creates a new delegator contract for a delegator beneficiary with the given validator owner under the terms\ndefined in the given ad for the input defined contract duration."
            },
            {
                "name": "keys_confirm",
                "args": [
                    {
                        "type": "application",
                        "name": "del_app",
                        "desc": "App ID of the delegator contract."
                    },
                    {
                        "type": "uint64",
                        "name": "del_app_idx",
                        "desc": "Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "address",
                        "name": "val_owner",
                        "desc": "Owner address for the validator ad."
                    },
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Delegator manager confirms that the keys have been confirmed by the delegator beneficiary."
            },
            {
                "name": "keys_not_confirmed",
                "args": [
                    {
                        "type": "address",
                        "name": "del_manager",
                        "desc": "Manager address for the delegation contract."
                    },
                    {
                        "type": "application",
                        "name": "del_app",
                        "desc": "App ID of the delegator contract."
                    },
                    {
                        "type": "uint64",
                        "name": "del_app_idx",
                        "desc": "Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "address",
                        "name": "val_owner",
                        "desc": "Owner address for the validator ad."
                    },
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Anyone confirms that delegator manager has not confirmed the confirmation of\nthe keys by the delegator beneficiary and failed to pay the operational fee in the agreed time."
            },
            {
                "name": "keys_not_submitted",
                "args": [
                    {
                        "type": "address",
                        "name": "del_manager",
                        "desc": "Manager address for the delegation contract."
                    },
                    {
                        "type": "application",
                        "name": "del_app",
                        "desc": "App ID of the delegator contract."
                    },
                    {
                        "type": "uint64",
                        "name": "del_app_idx",
                        "desc": "Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "address",
                        "name": "val_owner",
                        "desc": "Owner address for the validator ad."
                    },
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Anyone confirms that validator manager has not submitted the keys in the agreed time.\nInternally, the setup fee is returned to the delegator manager if possible."
            },
            {
                "name": "keys_submit",
                "args": [
                    {
                        "type": "address",
                        "name": "del_manager",
                        "desc": "Manager address for the delegation contract."
                    },
                    {
                        "type": "application",
                        "name": "del_app",
                        "desc": "App ID of the delegator contract."
                    },
                    {
                        "type": "uint64",
                        "name": "del_app_idx",
                        "desc": "Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "address",
                        "name": "val_owner",
                        "desc": "Owner address for the validator ad."
                    },
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "(uint64,uint64,uint64,byte[32],byte[32],byte[64],address)",
                        "name": "key_reg_txn_info",
                        "desc": "Information about the generated participation keys."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Validator manager submits the keys generated for the delegator beneficiary.\nInternally, the setup fee is assigned to the validator."
            },
            {
                "name": "breach_limits",
                "args": [
                    {
                        "type": "address",
                        "name": "del_manager",
                        "desc": "Manager address for the delegation contract."
                    },
                    {
                        "type": "application",
                        "name": "del_app",
                        "desc": "App ID of the delegator contract."
                    },
                    {
                        "type": "uint64",
                        "name": "del_app_idx",
                        "desc": "Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "address",
                        "name": "val_owner",
                        "desc": "Owner address for the validator ad."
                    },
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Reports that a limit breach event occurred on a delegator contract of a validator ad."
            },
            {
                "name": "breach_pay",
                "args": [
                    {
                        "type": "address",
                        "name": "del_manager",
                        "desc": "Manager address for the delegation contract."
                    },
                    {
                        "type": "application",
                        "name": "del_app",
                        "desc": "App ID of the delegator contract."
                    },
                    {
                        "type": "uint64",
                        "name": "del_app_idx",
                        "desc": "Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "address",
                        "name": "val_owner",
                        "desc": "Owner address for the validator ad."
                    },
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Reports that a payment cannot be made because the payment asset on a delegator contract\nhave been either frozen or clawed back."
            },
            {
                "name": "breach_suspended",
                "args": [
                    {
                        "type": "address",
                        "name": "del_manager",
                        "desc": "Manager address for the delegation contract."
                    },
                    {
                        "type": "application",
                        "name": "del_app",
                        "desc": "App ID of the delegator contract."
                    },
                    {
                        "type": "uint64",
                        "name": "del_app_idx",
                        "desc": "Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "address",
                        "name": "val_owner",
                        "desc": "Owner address for the validator ad."
                    },
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Reports that the delegator beneficiary was suspended by consensus."
            },
            {
                "name": "contract_claim",
                "args": [
                    {
                        "type": "address",
                        "name": "del_manager",
                        "desc": "Manager address for the delegation contract."
                    },
                    {
                        "type": "application",
                        "name": "del_app",
                        "desc": "App ID of the delegator contract."
                    },
                    {
                        "type": "uint64",
                        "name": "del_app_idx",
                        "desc": "Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "address",
                        "name": "val_owner",
                        "desc": "Owner address for the validator ad."
                    },
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    }
                ],
                "returns": {
                    "type": "(uint64,uint64,uint64)"
                },
                "desc": "Claims the operational fee up to this round from a delegator contract and\ntransfers it to the validator ad as well as the commission to the platform."
            },
            {
                "name": "contract_expired",
                "args": [
                    {
                        "type": "address",
                        "name": "del_manager",
                        "desc": "Manager address for the delegation contract."
                    },
                    {
                        "type": "application",
                        "name": "del_app",
                        "desc": "App ID of the delegator contract."
                    },
                    {
                        "type": "uint64",
                        "name": "del_app_idx",
                        "desc": "Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "address",
                        "name": "val_owner",
                        "desc": "Owner address for the validator ad."
                    },
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Reports that a delegator contract has expired."
            },
            {
                "name": "contract_withdraw",
                "args": [
                    {
                        "type": "application",
                        "name": "del_app",
                        "desc": "App ID of the delegator contract."
                    },
                    {
                        "type": "uint64",
                        "name": "del_app_idx",
                        "desc": "Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "address",
                        "name": "val_owner",
                        "desc": "Owner address for the validator ad."
                    },
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Delegator manager gracefully withdraws from the delegator contract prematurely."
            },
            {
                "name": "contract_delete",
                "args": [
                    {
                        "type": "application",
                        "name": "del_app",
                        "desc": "App ID of the delegator contract."
                    },
                    {
                        "type": "uint64",
                        "name": "del_app_idx",
                        "desc": "Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "address",
                        "name": "val_owner",
                        "desc": "Owner address for the validator ad."
                    },
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    }
                ],
                "returns": {
                    "type": "(uint64,uint64)",
                    "desc": "Balance of the fee asset that remained in the delegator contract."
                },
                "desc": "Deletes a delegator contract."
            },
            {
                "name": "contract_report_expiry_soon",
                "args": [
                    {
                        "type": "address",
                        "name": "del_manager",
                        "desc": "Manager address for the delegation contract."
                    },
                    {
                        "type": "application",
                        "name": "del_app",
                        "desc": "App ID of the delegator contract."
                    },
                    {
                        "type": "uint64",
                        "name": "del_app_idx",
                        "desc": "Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."
                    },
                    {
                        "type": "address",
                        "name": "val_owner",
                        "desc": "Owner address for the validator ad."
                    },
                    {
                        "type": "application",
                        "name": "val_app",
                        "desc": "App ID of the validator ad."
                    },
                    {
                        "type": "uint64",
                        "name": "val_app_idx",
                        "desc": "Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."
                    }
                ],
                "returns": {
                    "type": "void"
                },
                "desc": "Reports that the contract will expire soon."
            },
            {
                "name": "get_noticeboard_asset",
                "args": [
                    {
                        "type": "uint64",
                        "name": "asset_id"
                    }
                ],
                "returns": {
                    "type": "(bool,uint64,uint64,uint64)",
                    "desc": "Information about the payment asset that is or was accepted on the platform."
                },
                "desc": "Returns information about the payment asset that is or was accepted on the platform."
            },
            {
                "name": "get_noticeboard_user",
                "args": [
                    {
                        "type": "address",
                        "name": "user"
                    }
                ],
                "returns": {
                    "type": "(byte[4],byte[8],address,address,uint64[110],uint64)",
                    "desc": "Information about the user on the platform."
                },
                "desc": "Returns information about the user on the platform."
            }
        ],
        "networks": {},
        "desc": "\n    Platform for peer-to-peer consensus delegation.\n    Validators, i.e. node runners/operators, can post ads to offer their services to users.\n    Delegators, i.e. users/ALGO holders, can open requests for the service and conclude a contract with a validator.\n\n    Global state\n    ------------\n\n    pla_manager : Account\n        Platform manager account.\n\n    tc_sha256 : Sha256\n        Hash (i.e. SHA 256) of the template of delegation contract concluded between the delegator and validator.\n        This includes the Terms and Conditions.\n        The template has placeholders corresponding to variable names of other contract terms defined in this structure.\n\n    commission : UInt64\n        Relative commission on any earning.\n        It gets deducted from the earning and is paid to the platform.\n        The value is represented in ppm.\n        The maximum is 1_000_000.\n\n    noticeboard_fees : NoticeboardFees\n        Fees charged by the noticeboard.\n    noticeboard_terms_timing : NoticeboardTermsTiming\n        Noticeboard limits on timing terms for validator ads.\n    noticeboard_terms_pricing : NoticeboardTermsPricing\n        Noticeboard limits on pricing terms for validator ads.\n    noticeboard_terms_node : NoticeboardTermsNodeLimits\n        Noticeboard limits on node and related stake limit terms for validator ads.\n\n    state : Bytes\n        State of the contract. Can be one of the following:\n            DEPLOYED - noticeboard contract has been deployed.\n            SET - noticeboard has been set.\n            RETIRED - noticeboard has been retired. Operations no new ads or contracts can be opened.\n\n    app_id_old : UInt64\n        The app ID of previous version of the platform.\n    app_id_new : UInt64\n        The app ID of next version of the platform.\n\n    dll_val :  UsersDoubleLinkedList\n        Information about the double linked list of validator users.\n    dll_del :  UsersDoubleLinkedList\n        Information about the double linked list of delegator users.\n\n    Box storage\n    -----------\n    assets : asset_[asset_id] = NoticeboardAssetInfo\n        Box map for storing assets that are or were supported by the noticeboard at any point of time as a means of\n        payment between validators and delegators.\n        Each entry is a NoticeboardAssetInfo, which is struct with fields:\n            - a boolean marking whether the asset is currently accepted as payment (True) or not (False).\n            - minimum pricing parameters for this asset.\n        Keys correspond to \"asset_\" followed by byte representation of ASA ID or 0 for ALGO.\n        Once an entry is created, it cannot be deleted.\n\n    user : [arc4.Address] = UserInfo\n        Box map for storing data about validator owner or delegator manager user.\n        Each entry is a UserInfo, with fields for user role, list of app IDs and its counter, as well as\n        the previous and next user of the same role in the linked list.\n        Keys correspond to user address (32 Byte).\n\n    template_del : BOX_DELEGATOR_CONTRACT_TEMPLATE_KEY = Byte\n        Box for storing the delegator contract template.\n\n    template_val : BOX_VALIDATOR_AD_TEMPLATE_KEY = Byte\n        Box for storing the validator ad template.\n\n    partner : partner_[arc4.Address] = PartnerInfo\n        Box map for storing information about a partner of the platform.\n        Each entry is a PartnerInfo, which includes a UInt64 with the partners commission in ppm.\n        Keys correspond to \"partner_\" followed by partners address.\n\n    Methods\n    -------\n    noticeboard_deploy(\n        app_id_old: UInt64,\n    ) -> arc4.UInt64:\n        Creates a new Noticeboard.\n\n    noticeboard_migrate(\n        app_id_new: UInt64,\n    ) -> None:\n        Retires the current platform, preventing creation of new validator ads and modification of existing ones,\n        as well as creation of new delegation contracts and updating of existing ones.\n        Since retired platform cannot create new validator ads or modify existing ones, adding or removing\n        an ASA is not needed anymore.\n\n    noticeboard_set(\n        pla_manager: Account,\n        tc_sha256 : Sha256,\n        noticeboard_fees : NoticeboardFees,\n        noticeboard_terms_timing : NoticeboardTermsTiming,\n        noticeboard_terms_pricing : NoticeboardTermsPricing,\n        noticeboard_terms_node : NoticeboardTermsNodeLimits,\n    ) -> None:\n        Set (anew) all of the platform's operating parameters.\n\n    noticeboard_key_reg(\n        key_reg_info : KeyRegTxnInfo,\n        txn : gtxn.PaymentTransaction,\n    ) -> None:\n        Issues a key (de)registration transaction by the platform.\n\n    noticeboard_optin_asa(\n        asa : Asset,\n        sender : Account,\n        txn : gtxn.PaymentTransaction,\n    ) -> None:\n        Opts the platform address in to an ASA.\n\n    noticeboard_config_asset(\n        asset_id : UInt64,\n        asset_info : NoticeboardAssetInfo,\n        txn : gtxn.PaymentTransaction,\n    ) -> None:\n        Adds or modifies an asset from the accepted payment methods.\n\n    noticeboard_income(\n        asset_id : UInt64,\n    ) -> None:\n        Sends all platform earnings of asset to platform manager account.\n\n    template_load_init(\n        name: arc4.Byte,\n        template_size: UInt64,\n    ) -> None:\n        Starts the process of uploading a contract template.\n\n    template_load_data(\n        name: arc4.Byte,\n        offset: UInt64,\n        data: Bytes,\n    ) -> None:\n        Uploads a data chunk to a contract template.\n\n    partner_config(\n        partner_address: arc4.Address,\n        partner_commission: UInt64,\n        partner_delete: arc4.Bool,\n        txn : gtxn.PaymentTransaction,\n    ) -> None:\n        Creates or modifies a platform's partner.\n\n    gas(\n    ) -> None:\n        To fit more resources in app reference arrays.\n\n    user_create(\n        user_role : UInt64,\n        txn : gtxn.PaymentTransaction,\n    ) -> None:\n        Creates a new user data structure for the sender depending on the requested user role.\n\n    user_delete(\n    ) -> None:\n        Clears the user's existing role on noticeboard.\n\n    contract_create(\n        del_beneficiary: arc4.Address,\n        rounds_duration: UInt64,\n        stake_max: UInt64,\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n        del_app_idx: UInt64,\n        tc_sha256: Sha256,\n        partner_address: arc4.Address,\n        mbr_txn: gtxn.PaymentTransaction,\n        txn: gtxn.Transaction,\n    ) -> arc4.UInt64:\n\n    keys_confirm(\n        del_app: Application,\n        del_app_idx : UInt64,\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n    ) -> None:\n        Delegator manager confirms that the keys have been confirmed by the delegator beneficiary.\n\n    keys_not_confirmed(\n        del_manager: arc4.Address,\n        del_app: Application,\n        del_app_idx : UInt64,\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n    ) -> None:\n        Anyone confirms that delegator manager has not confirmed the confirmation of\n        the keys by the delegator beneficiary and failed to pay the operational fee\n        in the agreed time.\n\n    keys_not_submitted(\n        del_manager: arc4.Address,\n        del_app: Application,\n        del_app_idx : UInt64,\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n    ) -> None:\n        Anyone confirms that validator manager has not submitted the keys in the agreed time.\n\n    keys_submit(\n        del_manager: arc4.Address,\n        del_app: Application,\n        del_app_idx : UInt64,\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n        key_reg_txn_info : KeyRegTxnInfo,\n    ) -> None:\n        Validator manager submits the keys generated for the delegator beneficiary.\n\n    breach_limits(\n        del_manager: arc4.Address,\n        del_app: Application,\n        del_app_idx : UInt64,\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n    ) -> None:\n        Reports that a limit breach event occurred on a delegator contract of a validator ad.\n\n    breach_pay(\n        del_manager: arc4.Address,\n        del_app: Application,\n        del_app_idx : UInt64,\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n    ) -> None:\n        Reports that a payment cannot be made because the payment asset on a delegator contract\n        have been either frozen or clawed back.\n\n    breach_suspended(\n        del_manager: arc4.Address,\n        del_app: Application,\n        del_app_idx : UInt64,\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n    ) -> None:\n        Reports that the delegator beneficiary was suspended by consensus.\n\n    contract_claim(\n        del_manager: arc4.Address,\n        del_app: Application,\n        del_app_idx : UInt64,\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n    ) -> EarningsDistribution:\n        Claims the operational fee up to this round from a delegator contract and\n        transfers it to the validator ad as well as the commission to the platform.\n\n    contract_expired(\n        del_manager: arc4.Address,\n        del_app: Application,\n        del_app_idx : UInt64,\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n    ) -> None:\n        Reports that a delegator contract has expired.\n\n    contract_withdraw(\n        del_app: Application,\n        del_app_idx : UInt64,\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n    ) -> None:\n        Delegator manager gracefully withdraws from the delegator contract prematurely.\n\n    contract_delete(\n        del_app: Application,\n        del_app_idx : UInt64,\n    ) -> ContractDeleteReturn:\n        Deletes a delegator contract.\n\n    contract_report_expiry_soon(\n        del_manager: arc4.Address,\n        del_app: Application,\n        del_app_idx : UInt64,\n    ) -> None:\n        Reports that the contract will expire soon.\n\n    ad_create(\n        val_app_idx: UInt64,\n        terms_time: ValidatorTermsTiming,\n        terms_price: ValidatorTermsPricing,\n        terms_stake: ValidatorTermsStakeLimits,\n        terms_reqs: ValidatorTermsGating,\n        terms_warn: ValidatorTermsWarnings,\n        val_manager: arc4.Address,\n        live : arc4.Bool,\n        cnt_del_max : UInt64,\n        val_info: ValidatorSelfDisclosure,\n        mbr_delegator_template_box: UInt64,\n        txn: gtxn.PaymentTransaction,\n    ) -> arc4.UInt64:\n        Creates a new validator ad for the sender (i.e. validator owner).\n\n    ad_config(\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n        val_manager: arc4.Address,\n        live : arc4.Bool,\n        cnt_del_max : UInt64,\n    ) -> None:\n        Sets all operation configuration parameters for the validator ad\n\n    ad_delete(\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n    ) -> None:\n        Validator owner deletes a validator ad.\n\n    ad_ready(\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n        ready: arc4.Bool,\n    ) -> None:\n        Ad manager sets its readiness for operation.\n\n    ad_self_disclose(\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n        val_info: ValidatorSelfDisclosure,\n    ) -> None:\n        Ad owner sets its self-disclosure information.\n\n    ad_terms(\n        val_owner: arc4.Address,\n        val_app: Application,\n        val_app_idx: UInt64,\n        terms_time: ValidatorTermsTiming,\n        terms_price: ValidatorTermsPricing,\n        terms_stake: ValidatorTermsStakeLimits,\n        terms_reqs: ValidatorTermsGating,\n        terms_warn: ValidatorTermsWarnings,\n        txn: gtxn.PaymentTransaction,\n    ) -> None:\n        Sets all the terms for creating a delegation contract.\n\n    ad_income(\n        val_app: Application,\n        val_app_idx: UInt64,\n        asset_id: UInt64,\n    ) -> arc4.UInt64:\n        Validator owner withdraws all available balance from the validator ad for the given asset.\n\n    ad_asa_close(\n        val_app: Application,\n        val_app_idx: UInt64,\n        asset_id: UInt64,\n    ) -> None:\n        Removes the asset's storage on the validator ad.\n\n    get_noticeboard_asset(\n        asset_id : UInt64,\n    ) -> NoticeboardAssetInfo:\n        Returns information about the payment asset that is or was accepted on the platform.\n\n    get_noticeboard_user(\n        user : arc4.Address,\n    ) -> UserInfo:\n        Returns information about the user on the platform.\n\n    "
    },
    "bare_call_config": {}
}"""
APP_SPEC = algokit_utils.ApplicationSpecification.from_json(_APP_SPEC_JSON)
_TReturn = typing.TypeVar("_TReturn")


class _ArgsBase(ABC, typing.Generic[_TReturn]):
    @staticmethod
    @abstractmethod
    def method() -> str:
        ...


_TArgs = typing.TypeVar("_TArgs", bound=_ArgsBase[typing.Any])


@dataclasses.dataclass(kw_only=True)
class _TArgsHolder(typing.Generic[_TArgs]):
    args: _TArgs


@dataclasses.dataclass(kw_only=True)
class DeployCreate(algokit_utils.DeployCreateCallArgs, _TArgsHolder[_TArgs], typing.Generic[_TArgs]):
    pass


def _filter_none(value: dict | typing.Any) -> dict | typing.Any:
    if isinstance(value, dict):
        return {k: _filter_none(v) for k, v in value.items() if v is not None}
    return value


def _as_dict(data: typing.Any, *, convert_all: bool = True) -> dict[str, typing.Any]:
    if data is None:
        return {}
    if not dataclasses.is_dataclass(data):
        raise TypeError(f"{data} must be a dataclass")
    if convert_all:
        result = dataclasses.asdict(data) # type: ignore[call-overload]
    else:
        result = {f.name: getattr(data, f.name) for f in dataclasses.fields(data)}
    return _filter_none(result)


def _convert_transaction_parameters(
    transaction_parameters: algokit_utils.TransactionParameters | None,
) -> algokit_utils.TransactionParametersDict:
    return typing.cast(algokit_utils.TransactionParametersDict, _as_dict(transaction_parameters))


def _convert_call_transaction_parameters(
    transaction_parameters: algokit_utils.TransactionParameters | None,
) -> algokit_utils.OnCompleteCallParametersDict:
    return typing.cast(algokit_utils.OnCompleteCallParametersDict, _as_dict(transaction_parameters))


def _convert_create_transaction_parameters(
    transaction_parameters: algokit_utils.TransactionParameters | None,
    on_complete: algokit_utils.OnCompleteActionName,
) -> algokit_utils.CreateCallParametersDict:
    result = typing.cast(algokit_utils.CreateCallParametersDict, _as_dict(transaction_parameters))
    on_complete_enum = on_complete.replace("_", " ").title().replace(" ", "") + "OC"
    result["on_complete"] = getattr(algosdk.transaction.OnComplete, on_complete_enum)
    return result


def _convert_deploy_args(
    deploy_args: algokit_utils.DeployCallArgs | None,
) -> algokit_utils.ABICreateCallArgsDict | None:
    if deploy_args is None:
        return None

    deploy_args_dict = typing.cast(algokit_utils.ABICreateCallArgsDict, _as_dict(deploy_args))
    if isinstance(deploy_args, _TArgsHolder):
        deploy_args_dict["args"] = _as_dict(deploy_args.args)
        deploy_args_dict["method"] = deploy_args.args.method()

    return deploy_args_dict


@dataclasses.dataclass(kw_only=True)
class NoticeboardMigrateArgs(_ArgsBase[None]):
    """Retires the current platform, preventing creation of new validator ads and modification of existing ones,
    as well as creation of new delegation contracts and updating of existing ones. Since retired platform cannot create new validator ads or modify existing ones, adding or removing an ASA is not needed anymore."""

    app_id_new: int
    """The app ID of next version of the platform."""

    @staticmethod
    def method() -> str:
        return "noticeboard_migrate(uint64)void"


@dataclasses.dataclass(kw_only=True)
class NoticeboardFees:
    val_user_reg: int
    del_user_reg: int
    val_ad_creation: int
    del_contract_creation: int


@dataclasses.dataclass(kw_only=True)
class NoticeboardTermsTiming:
    rounds_duration_min_min: int
    rounds_duration_max_max: int
    before_expiry: int
    report_period: int


@dataclasses.dataclass(kw_only=True)
class NoticeboardTermsPricing:
    commission_min: int


@dataclasses.dataclass(kw_only=True)
class NoticeboardTermsNodeLimits:
    stake_max_max: int
    cnt_del_max_max: int


@dataclasses.dataclass(kw_only=True)
class NoticeboardSetArgs(_ArgsBase[None]):
    """Set (anew) all of the platform's operating parameters."""

    pla_manager: str | bytes
    """Platform manager account."""
    tc_sha256: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int]
    """Hash (i.e. SHA 256) of the template of delegation contract concluded between the delegator and validator. This includes the Terms and Conditions. The template has placeholders corresponding to variable names of contract terms defined in this structure."""
    noticeboard_fees: NoticeboardFees
    """Fees charged by the noticeboard."""
    noticeboard_terms_timing: NoticeboardTermsTiming
    """Noticeboard limits on timing terms for validator ads."""
    noticeboard_terms_pricing: NoticeboardTermsPricing
    """Noticeboard limits on pricing terms for validator ads."""
    noticeboard_terms_node: NoticeboardTermsNodeLimits
    """Noticeboard limits on node and related stake limit terms for validator ads."""

    @staticmethod
    def method() -> str:
        return "noticeboard_set(account,byte[32],(uint64,uint64,uint64,uint64),(uint64,uint64,uint64,uint64),(uint64),(uint64,uint64))void"


@dataclasses.dataclass(kw_only=True)
class KeyRegTxnInfo:
    vote_first: int
    vote_last: int
    vote_key_dilution: int
    vote_pk: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int]
    selection_pk: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int]
    state_proof_pk: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int]
    sender: str


@dataclasses.dataclass(kw_only=True)
class NoticeboardKeyRegArgs(_ArgsBase[None]):
    """Issues a key (de)registration transaction by the platform."""

    key_reg_info: KeyRegTxnInfo
    """Key registration information to send."""
    txn: TransactionWithSigner
    """Payment transaction to cover costs for the key (de)registration fee."""

    @staticmethod
    def method() -> str:
        return "noticeboard_key_reg((uint64,uint64,uint64,byte[32],byte[32],byte[64],address),pay)void"


@dataclasses.dataclass(kw_only=True)
class NoticeboardOptinAsaArgs(_ArgsBase[None]):
    """Opts the platform address in to an ASA."""

    asa: int
    """Asset to opt into."""
    sender: str | bytes
    """Account to opt into the asa."""
    txn: TransactionWithSigner
    """Payment transaction to cover MBR increase."""

    @staticmethod
    def method() -> str:
        return "noticeboard_optin_asa(asset,account,pay)void"


@dataclasses.dataclass(kw_only=True)
class NoticeboardAssetInfo:
    accepted: bool
    fee_round_min_min: int
    fee_round_var_min: int
    fee_setup_min: int


@dataclasses.dataclass(kw_only=True)
class NoticeboardConfigAssetArgs(_ArgsBase[None]):
    """Adds or modifies an asset from the accepted payment methods."""

    asset_id: int
    """ID of asset to add or modify as an accepted payment method, i.e. ASA ID or 0 for ALGO."""
    asset_info: NoticeboardAssetInfo
    """Information about the payment asset, i.e. if it is accepted as a payment at the platform (True) or not (False), and its minimum pricing limits."""
    txn: TransactionWithSigner
    """Payment transaction to cover (potential) MBR increase."""

    @staticmethod
    def method() -> str:
        return "noticeboard_config_asset(uint64,(bool,uint64,uint64,uint64),pay)void"


@dataclasses.dataclass(kw_only=True)
class NoticeboardIncomeArgs(_ArgsBase[None]):
    """Sends all platform earnings of asset to platform manager account."""

    asset_id: int
    """ID of asset to withdraw all earnings."""

    @staticmethod
    def method() -> str:
        return "noticeboard_income(uint64)void"


@dataclasses.dataclass(kw_only=True)
class TemplateLoadInitArgs(_ArgsBase[None]):
    """Starts the process of uploading a contract template."""

    name: int
    """Name of the box with the contract template."""
    template_size: int
    """Size of the delegator contract template in bytes."""

    @staticmethod
    def method() -> str:
        return "template_load_init(byte,uint64)void"


@dataclasses.dataclass(kw_only=True)
class TemplateLoadDataArgs(_ArgsBase[None]):
    """Uploads a data chunk to a contract template."""

    name: int
    """Name of the box with the contract template."""
    offset: int
    """Offset in the box at which to replace the data."""
    data: bytes | bytearray
    """Data to replace in the box at the defined position."""

    @staticmethod
    def method() -> str:
        return "template_load_data(byte,uint64,byte[])void"


@dataclasses.dataclass(kw_only=True)
class PartnerConfigArgs(_ArgsBase[None]):
    """Creates or modifies a platform's partner."""

    partner_address: str
    """Address of the partner to register on the platform."""
    partner_commission: int
    """Partner's convenience fee, i.e. relative commission, charged on top of validator price for partner's convenience offer. The value is represented in ppm."""
    partner_delete: bool
    """Boolean set to true to delete the partner from the platform, otherwise create or modify it."""
    txn: TransactionWithSigner
    """Payment transaction to cover (potential) MBR increase."""

    @staticmethod
    def method() -> str:
        return "partner_config(address,uint64,bool,pay)void"


@dataclasses.dataclass(kw_only=True)
class GasArgs(_ArgsBase[None]):
    """To fit more resources in app reference arrays."""

    @staticmethod
    def method() -> str:
        return "gas()void"


@dataclasses.dataclass(kw_only=True)
class UserCreateArgs(_ArgsBase[None]):
    """Creates a new user data structure for the sender depending on the requested user role."""

    user_role: bytes | bytearray | tuple[int, int, int, int]
    """Role to requested by the user. Possible options:     ROLE_VAL - user is a validator.     ROLE_DEL - user is a delegator."""
    txn: TransactionWithSigner
    """Payment transaction to cover MBR increase and user creation fee."""

    @staticmethod
    def method() -> str:
        return "user_create(byte[4],pay)void"


@dataclasses.dataclass(kw_only=True)
class UserDeleteArgs(_ArgsBase[None]):
    """Clears the user's existing role on noticeboard."""

    @staticmethod
    def method() -> str:
        return "user_delete()void"


@dataclasses.dataclass(kw_only=True)
class AdCreateArgs(_ArgsBase[int]):
    """Creates a new validator ad for the sender (i.e. validator owner)."""

    val_app_idx: int
    """Index in the validator owner app list at which to place the newly created validator ad. This is to save on opcode cost instead of looping through the whole list."""
    txn: TransactionWithSigner
    """Transaction for the payment of the validator ad creation fee and all the MBR increases at Noticeboard and the newly created ValidatorAd."""

    @staticmethod
    def method() -> str:
        return "ad_create(uint64,pay)uint64"


@dataclasses.dataclass(kw_only=True)
class AdConfigArgs(_ArgsBase[None]):
    """Sets all operation configuration parameters for the validator ad, i.e.
    the validator manager account, the status whether the ad is live to accept new delegators (`live=True`) or not (`live=False`), and the maximum number of delegators the validator ad can accept."""

    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""
    val_manager: str
    """Manager address for the validator ad."""
    live: bool
    """Set to True if the newly created validator ad should be accepting new delegators right away, otherwise set to False."""
    cnt_del_max: int
    """Maximum number of delegators the validator is willing to manage simultaneously."""

    @staticmethod
    def method() -> str:
        return "ad_config(application,uint64,address,bool,uint64)void"


@dataclasses.dataclass(kw_only=True)
class AdDeleteArgs(_ArgsBase[None]):
    """Validator owner deletes a validator ad.
    Possible only if there are no active delegators and all balances have been claimed."""

    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""

    @staticmethod
    def method() -> str:
        return "ad_delete(application,uint64)void"


@dataclasses.dataclass(kw_only=True)
class AdReadyArgs(_ArgsBase[None]):
    """Ad manager sets its readiness for operation."""

    val_owner: str
    """Owner address for the validator ad."""
    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""
    ready: bool
    """Set to True if validator manager is ready for accepting new delegators, otherwise set to False."""

    @staticmethod
    def method() -> str:
        return "ad_ready(address,application,uint64,bool)void"


@dataclasses.dataclass(kw_only=True)
class ValidatorSelfDisclosure:
    name: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int]
    https: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int]
    country_code: bytes | bytearray | tuple[int, int]
    hw_cat: int
    node_version: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int]


@dataclasses.dataclass(kw_only=True)
class AdSelfDiscloseArgs(_ArgsBase[None]):
    """Ad owner sets its self-disclosure information."""

    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""
    val_info: ValidatorSelfDisclosure
    """Self-disclosed information about the validator."""

    @staticmethod
    def method() -> str:
        return "ad_self_disclose(application,uint64,(byte[30],byte[60],byte[2],uint64,byte[20]))void"


@dataclasses.dataclass(kw_only=True)
class ValidatorTermsTiming:
    rounds_setup: int
    rounds_confirm: int
    rounds_duration_min: int
    rounds_duration_max: int
    round_max_end: int


@dataclasses.dataclass(kw_only=True)
class ValidatorTermsPricing:
    commission: int
    fee_round_min: int
    fee_round_var: int
    fee_setup: int
    fee_asset_id: int


@dataclasses.dataclass(kw_only=True)
class ValidatorTermsStakeLimits:
    stake_max: int
    stake_gratis: int


@dataclasses.dataclass(kw_only=True)
class ValidatorTermsGating:
    gating_asa_list: list[tuple[int, int]] | tuple[tuple[int, int], tuple[int, int]]


@dataclasses.dataclass(kw_only=True)
class ValidatorTermsWarnings:
    cnt_warning_max: int
    rounds_warning: int


@dataclasses.dataclass(kw_only=True)
class AdTermsArgs(_ArgsBase[None]):
    """Sets all the terms for creating a delegation contract.
    With this action, the validator agrees with the (new) terms."""

    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""
    tc_sha256: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int]
    """Hash (i.e. SHA 256) of the Terms and Conditions agreed by the validator."""
    terms_time: ValidatorTermsTiming
    """Validator's terms about timing."""
    terms_price: ValidatorTermsPricing
    """Validator's terms about pricing."""
    terms_stake: ValidatorTermsStakeLimits
    """Validator's terms about stake limits."""
    terms_reqs: ValidatorTermsGating
    """Validator's terms about gating requirements."""
    terms_warn: ValidatorTermsWarnings
    """Validator's terms about warnings."""
    mbr_delegator_template_box: int
    """Amount needed to pay to the validator ad for creating box for delegator template."""
    txn: TransactionWithSigner
    """Transaction for the payment of potential MBR increase of ValidatorAd in case of ASA opt-in and payment of box for delegator contract template box in case the ValidatorAd is in STATE_CREATED."""

    @staticmethod
    def method() -> str:
        return "ad_terms(application,uint64,byte[32],(uint64,uint64,uint64,uint64,uint64),(uint64,uint64,uint64,uint64,uint64),(uint64,uint64),((uint64,uint64)[2]),(uint64,uint64),uint64,pay)void"


@dataclasses.dataclass(kw_only=True)
class AdIncomeArgs(_ArgsBase[int]):
    """Validator owner withdraws all available balance from the validator ad for the given asset."""

    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""
    asset_id: int
    """ID of the asset (i.e. ASA ID or 0 for ALGO) for which the owner would like to withdraw all earnings from the validator ad."""

    @staticmethod
    def method() -> str:
        return "ad_income(application,uint64,uint64)uint64"


@dataclasses.dataclass(kw_only=True)
class AdAsaCloseArgs(_ArgsBase[None]):
    """Removes the asset's storage on the validator ad."""

    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""
    asset_id: int
    """ID of the asset (i.e. ASA ID or 0 for ALGO) for which the owner would like to withdraw all earnings from the validator ad."""

    @staticmethod
    def method() -> str:
        return "ad_asa_close(application,uint64,uint64)void"


@dataclasses.dataclass(kw_only=True)
class ContractCreateArgs(_ArgsBase[int]):
    """Creates a new delegator contract for a delegator beneficiary with the given validator owner under the terms
    defined in the given ad for the input defined contract duration."""

    del_beneficiary: str
    """Beneficiary address for the new delegation contract."""
    rounds_duration: int
    """Contract duration in number of rounds."""
    stake_max: int
    """The maximum amount of ALGO that the delegator beneficiary address intends to have at any point in time during the contract duration."""
    val_owner: str
    """Owner address for the validator ad."""
    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""
    del_app_idx: int
    """Index of the delegator manager app list at which to store the new delegator contract. This is to save on opcode cost instead of looping through the whole list."""
    tc_sha256: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int]
    """Hash (i.e. SHA 256) of the Terms and Conditions agreed by the delegator."""
    partner_address: str
    """Address of the partner that facilitated the contract creation. If there is no partner, set to Global.zero_address."""
    mbr_txn: TransactionWithSigner
    """Payment transaction for the payment of the increase of validator ad MBR due to creation of a new contract and payment of delegator contract creation fee."""
    txn: TransactionWithSigner
    """Transaction for the payment of the setup and operational fee."""

    @staticmethod
    def method() -> str:
        return "contract_create(address,uint64,uint64,address,application,uint64,uint64,byte[32],address,pay,txn)uint64"


@dataclasses.dataclass(kw_only=True)
class KeysConfirmArgs(_ArgsBase[None]):
    """Delegator manager confirms that the keys have been confirmed by the delegator beneficiary."""

    del_app: int
    """App ID of the delegator contract."""
    del_app_idx: int
    """Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."""
    val_owner: str
    """Owner address for the validator ad."""
    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""

    @staticmethod
    def method() -> str:
        return "keys_confirm(application,uint64,address,application,uint64)void"


@dataclasses.dataclass(kw_only=True)
class KeysNotConfirmedArgs(_ArgsBase[None]):
    """Anyone confirms that delegator manager has not confirmed the confirmation of
    the keys by the delegator beneficiary and failed to pay the operational fee in the agreed time."""

    del_manager: str
    """Manager address for the delegation contract."""
    del_app: int
    """App ID of the delegator contract."""
    del_app_idx: int
    """Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."""
    val_owner: str
    """Owner address for the validator ad."""
    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""

    @staticmethod
    def method() -> str:
        return "keys_not_confirmed(address,application,uint64,address,application,uint64)void"


@dataclasses.dataclass(kw_only=True)
class KeysNotSubmittedArgs(_ArgsBase[None]):
    """Anyone confirms that validator manager has not submitted the keys in the agreed time.
    Internally, the setup fee is returned to the delegator manager if possible."""

    del_manager: str
    """Manager address for the delegation contract."""
    del_app: int
    """App ID of the delegator contract."""
    del_app_idx: int
    """Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."""
    val_owner: str
    """Owner address for the validator ad."""
    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""

    @staticmethod
    def method() -> str:
        return "keys_not_submitted(address,application,uint64,address,application,uint64)void"


@dataclasses.dataclass(kw_only=True)
class KeysSubmitArgs(_ArgsBase[None]):
    """Validator manager submits the keys generated for the delegator beneficiary.
    Internally, the setup fee is assigned to the validator."""

    del_manager: str
    """Manager address for the delegation contract."""
    del_app: int
    """App ID of the delegator contract."""
    del_app_idx: int
    """Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."""
    val_owner: str
    """Owner address for the validator ad."""
    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""
    key_reg_txn_info: KeyRegTxnInfo
    """Information about the generated participation keys."""

    @staticmethod
    def method() -> str:
        return "keys_submit(address,application,uint64,address,application,uint64,(uint64,uint64,uint64,byte[32],byte[32],byte[64],address))void"


@dataclasses.dataclass(kw_only=True)
class BreachLimitsArgs(_ArgsBase[None]):
    """Reports that a limit breach event occurred on a delegator contract of a validator ad."""

    del_manager: str
    """Manager address for the delegation contract."""
    del_app: int
    """App ID of the delegator contract."""
    del_app_idx: int
    """Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."""
    val_owner: str
    """Owner address for the validator ad."""
    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""

    @staticmethod
    def method() -> str:
        return "breach_limits(address,application,uint64,address,application,uint64)void"


@dataclasses.dataclass(kw_only=True)
class BreachPayArgs(_ArgsBase[None]):
    """Reports that a payment cannot be made because the payment asset on a delegator contract
    have been either frozen or clawed back."""

    del_manager: str
    """Manager address for the delegation contract."""
    del_app: int
    """App ID of the delegator contract."""
    del_app_idx: int
    """Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."""
    val_owner: str
    """Owner address for the validator ad."""
    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""

    @staticmethod
    def method() -> str:
        return "breach_pay(address,application,uint64,address,application,uint64)void"


@dataclasses.dataclass(kw_only=True)
class BreachSuspendedArgs(_ArgsBase[None]):
    """Reports that the delegator beneficiary was suspended by consensus."""

    del_manager: str
    """Manager address for the delegation contract."""
    del_app: int
    """App ID of the delegator contract."""
    del_app_idx: int
    """Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."""
    val_owner: str
    """Owner address for the validator ad."""
    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""

    @staticmethod
    def method() -> str:
        return "breach_suspended(address,application,uint64,address,application,uint64)void"


@dataclasses.dataclass(kw_only=True)
class EarningsDistribution:
    user: int
    platform: int
    asset_id: int


@dataclasses.dataclass(kw_only=True)
class ContractClaimArgs(_ArgsBase[EarningsDistribution]):
    """Claims the operational fee up to this round from a delegator contract and
    transfers it to the validator ad as well as the commission to the platform."""

    del_manager: str
    """Manager address for the delegation contract."""
    del_app: int
    """App ID of the delegator contract."""
    del_app_idx: int
    """Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."""
    val_owner: str
    """Owner address for the validator ad."""
    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""

    @staticmethod
    def method() -> str:
        return "contract_claim(address,application,uint64,address,application,uint64)(uint64,uint64,uint64)"


@dataclasses.dataclass(kw_only=True)
class ContractExpiredArgs(_ArgsBase[None]):
    """Reports that a delegator contract has expired."""

    del_manager: str
    """Manager address for the delegation contract."""
    del_app: int
    """App ID of the delegator contract."""
    del_app_idx: int
    """Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."""
    val_owner: str
    """Owner address for the validator ad."""
    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""

    @staticmethod
    def method() -> str:
        return "contract_expired(address,application,uint64,address,application,uint64)void"


@dataclasses.dataclass(kw_only=True)
class ContractWithdrawArgs(_ArgsBase[None]):
    """Delegator manager gracefully withdraws from the delegator contract prematurely."""

    del_app: int
    """App ID of the delegator contract."""
    del_app_idx: int
    """Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."""
    val_owner: str
    """Owner address for the validator ad."""
    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""

    @staticmethod
    def method() -> str:
        return "contract_withdraw(application,uint64,address,application,uint64)void"


@dataclasses.dataclass(kw_only=True)
class ContractDeleteReturn:
    remaining_balance: int
    asset_id: int


@dataclasses.dataclass(kw_only=True)
class ContractDeleteArgs(_ArgsBase[ContractDeleteReturn]):
    """Deletes a delegator contract."""

    del_app: int
    """App ID of the delegator contract."""
    del_app_idx: int
    """Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."""
    val_owner: str
    """Owner address for the validator ad."""
    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""

    @staticmethod
    def method() -> str:
        return "contract_delete(application,uint64,address,application,uint64)(uint64,uint64)"


@dataclasses.dataclass(kw_only=True)
class ContractReportExpirySoonArgs(_ArgsBase[None]):
    """Reports that the contract will expire soon."""

    del_manager: str
    """Manager address for the delegation contract."""
    del_app: int
    """App ID of the delegator contract."""
    del_app_idx: int
    """Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list."""
    val_owner: str
    """Owner address for the validator ad."""
    val_app: int
    """App ID of the validator ad."""
    val_app_idx: int
    """Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list."""

    @staticmethod
    def method() -> str:
        return "contract_report_expiry_soon(address,application,uint64,address,application,uint64)void"


@dataclasses.dataclass(kw_only=True)
class GetNoticeboardAssetArgs(_ArgsBase[NoticeboardAssetInfo]):
    """Returns information about the payment asset that is or was accepted on the platform."""

    asset_id: int

    @staticmethod
    def method() -> str:
        return "get_noticeboard_asset(uint64)(bool,uint64,uint64,uint64)"


@dataclasses.dataclass(kw_only=True)
class UserInfo:
    role: bytes | bytearray | tuple[int, int, int, int]
    dll_name: bytes | bytearray | tuple[int, int, int, int, int, int, int, int]
    prev_user: str
    next_user: str
    app_ids: list[int] | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int]
    cnt_app_ids: int


@dataclasses.dataclass(kw_only=True)
class GetNoticeboardUserArgs(_ArgsBase[UserInfo]):
    """Returns information about the user on the platform."""

    user: str

    @staticmethod
    def method() -> str:
        return "get_noticeboard_user(address)(byte[4],byte[8],address,address,uint64[110],uint64)"


@dataclasses.dataclass(kw_only=True)
class NoticeboardDeployArgs(_ArgsBase[int]):
    """Creates a new Noticeboard."""

    app_id_old: int
    """The app ID of previous version of the platform."""

    @staticmethod
    def method() -> str:
        return "noticeboard_deploy(uint64)uint64"


class ByteReader:
    def __init__(self, data: bytes):
        self._data = data

    @property
    def as_bytes(self) -> bytes:
        return self._data

    @property
    def as_str(self) -> str:
        return self._data.decode("utf8")

    @property
    def as_base64(self) -> str:
        return base64.b64encode(self._data).decode("utf8")

    @property
    def as_hex(self) -> str:
        return self._data.hex()


class GlobalState:
    def __init__(self, data: dict[bytes, bytes | int]):
        self.app_id_new = typing.cast(int, data.get(b"app_id_new"))
        self.app_id_old = typing.cast(int, data.get(b"app_id_old"))
        self.dll_del = ByteReader(typing.cast(bytes, data.get(b"dll__del")))
        self.dll_val = ByteReader(typing.cast(bytes, data.get(b"dll__val")))
        self.noticeboard_fees = ByteReader(typing.cast(bytes, data.get(b"noticeboard_fees")))
        self.noticeboard_terms_node = ByteReader(typing.cast(bytes, data.get(b"noticeboard_terms_node")))
        self.noticeboard_terms_pricing = ByteReader(typing.cast(bytes, data.get(b"noticeboard_terms_pricing")))
        self.noticeboard_terms_timing = ByteReader(typing.cast(bytes, data.get(b"noticeboard_terms_timing")))
        self.pla_manager = ByteReader(typing.cast(bytes, data.get(b"pla_manager")))
        self.state = ByteReader(typing.cast(bytes, data.get(b"state")))
        self.tc_sha256 = ByteReader(typing.cast(bytes, data.get(b"tc_sha256")))


@dataclasses.dataclass(kw_only=True)
class SimulateOptions:
    allow_more_logs: bool = dataclasses.field(default=False)
    allow_empty_signatures: bool = dataclasses.field(default=False)
    extra_opcode_budget: int = dataclasses.field(default=0)
    exec_trace_config: models.SimulateTraceConfig | None         = dataclasses.field(default=None)


class Composer:

    def __init__(self, app_client: algokit_utils.ApplicationClient, atc: AtomicTransactionComposer):
        self.app_client = app_client
        self.atc = atc

    def build(self) -> AtomicTransactionComposer:
        return self.atc

    def simulate(self, options: SimulateOptions | None = None) -> SimulateAtomicTransactionResponse:
        request = models.SimulateRequest(
            allow_more_logs=options.allow_more_logs,
            allow_empty_signatures=options.allow_empty_signatures,
            extra_opcode_budget=options.extra_opcode_budget,
            exec_trace_config=options.exec_trace_config,
            txn_groups=[]
        ) if options else None
        result = self.atc.simulate(self.app_client.algod_client, request)
        return result

    def execute(self) -> AtomicTransactionResponse:
        return self.app_client.execute_atc(self.atc)

    def noticeboard_migrate(
        self,
        *,
        app_id_new: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Retires the current platform, preventing creation of new validator ads and modification of existing ones,
        as well as creation of new delegation contracts and updating of existing ones. Since retired platform cannot create new validator ads or modify existing ones, adding or removing an ASA is not needed anymore.
        
        Adds a call to `noticeboard_migrate(uint64)void` ABI method
        
        :param int app_id_new: The app ID of next version of the platform.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = NoticeboardMigrateArgs(
            app_id_new=app_id_new,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def noticeboard_set(
        self,
        *,
        pla_manager: str | bytes,
        tc_sha256: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int],
        noticeboard_fees: NoticeboardFees,
        noticeboard_terms_timing: NoticeboardTermsTiming,
        noticeboard_terms_pricing: NoticeboardTermsPricing,
        noticeboard_terms_node: NoticeboardTermsNodeLimits,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Set (anew) all of the platform's operating parameters.
        
        Adds a call to `noticeboard_set(account,byte[32],(uint64,uint64,uint64,uint64),(uint64,uint64,uint64,uint64),(uint64),(uint64,uint64))void` ABI method
        
        :param str | bytes pla_manager: Platform manager account.
        :param bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int] tc_sha256: Hash (i.e. SHA 256) of the template of delegation contract concluded between the delegator and validator. This includes the Terms and Conditions. The template has placeholders corresponding to variable names of contract terms defined in this structure.
        :param NoticeboardFees noticeboard_fees: Fees charged by the noticeboard.
        :param NoticeboardTermsTiming noticeboard_terms_timing: Noticeboard limits on timing terms for validator ads.
        :param NoticeboardTermsPricing noticeboard_terms_pricing: Noticeboard limits on pricing terms for validator ads.
        :param NoticeboardTermsNodeLimits noticeboard_terms_node: Noticeboard limits on node and related stake limit terms for validator ads.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = NoticeboardSetArgs(
            pla_manager=pla_manager,
            tc_sha256=tc_sha256,
            noticeboard_fees=noticeboard_fees,
            noticeboard_terms_timing=noticeboard_terms_timing,
            noticeboard_terms_pricing=noticeboard_terms_pricing,
            noticeboard_terms_node=noticeboard_terms_node,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def noticeboard_key_reg(
        self,
        *,
        key_reg_info: KeyRegTxnInfo,
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Issues a key (de)registration transaction by the platform.
        
        Adds a call to `noticeboard_key_reg((uint64,uint64,uint64,byte[32],byte[32],byte[64],address),pay)void` ABI method
        
        :param KeyRegTxnInfo key_reg_info: Key registration information to send.
        :param TransactionWithSigner txn: Payment transaction to cover costs for the key (de)registration fee.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = NoticeboardKeyRegArgs(
            key_reg_info=key_reg_info,
            txn=txn,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def noticeboard_optin_asa(
        self,
        *,
        asa: int,
        sender: str | bytes,
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Opts the platform address in to an ASA.
        
        Adds a call to `noticeboard_optin_asa(asset,account,pay)void` ABI method
        
        :param int asa: Asset to opt into.
        :param str | bytes sender: Account to opt into the asa.
        :param TransactionWithSigner txn: Payment transaction to cover MBR increase.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = NoticeboardOptinAsaArgs(
            asa=asa,
            sender=sender,
            txn=txn,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def noticeboard_config_asset(
        self,
        *,
        asset_id: int,
        asset_info: NoticeboardAssetInfo,
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Adds or modifies an asset from the accepted payment methods.
        
        Adds a call to `noticeboard_config_asset(uint64,(bool,uint64,uint64,uint64),pay)void` ABI method
        
        :param int asset_id: ID of asset to add or modify as an accepted payment method, i.e. ASA ID or 0 for ALGO.
        :param NoticeboardAssetInfo asset_info: Information about the payment asset, i.e. if it is accepted as a payment at the platform (True) or not (False), and its minimum pricing limits.
        :param TransactionWithSigner txn: Payment transaction to cover (potential) MBR increase.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = NoticeboardConfigAssetArgs(
            asset_id=asset_id,
            asset_info=asset_info,
            txn=txn,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def noticeboard_income(
        self,
        *,
        asset_id: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Sends all platform earnings of asset to platform manager account.
        
        Adds a call to `noticeboard_income(uint64)void` ABI method
        
        :param int asset_id: ID of asset to withdraw all earnings.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = NoticeboardIncomeArgs(
            asset_id=asset_id,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def template_load_init(
        self,
        *,
        name: int,
        template_size: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Starts the process of uploading a contract template.
        
        Adds a call to `template_load_init(byte,uint64)void` ABI method
        
        :param int name: Name of the box with the contract template.
        :param int template_size: Size of the delegator contract template in bytes.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = TemplateLoadInitArgs(
            name=name,
            template_size=template_size,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def template_load_data(
        self,
        *,
        name: int,
        offset: int,
        data: bytes | bytearray,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Uploads a data chunk to a contract template.
        
        Adds a call to `template_load_data(byte,uint64,byte[])void` ABI method
        
        :param int name: Name of the box with the contract template.
        :param int offset: Offset in the box at which to replace the data.
        :param bytes | bytearray data: Data to replace in the box at the defined position.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = TemplateLoadDataArgs(
            name=name,
            offset=offset,
            data=data,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def partner_config(
        self,
        *,
        partner_address: str,
        partner_commission: int,
        partner_delete: bool,
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Creates or modifies a platform's partner.
        
        Adds a call to `partner_config(address,uint64,bool,pay)void` ABI method
        
        :param str partner_address: Address of the partner to register on the platform.
        :param int partner_commission: Partner's convenience fee, i.e. relative commission, charged on top of validator price for partner's convenience offer. The value is represented in ppm.
        :param bool partner_delete: Boolean set to true to delete the partner from the platform, otherwise create or modify it.
        :param TransactionWithSigner txn: Payment transaction to cover (potential) MBR increase.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = PartnerConfigArgs(
            partner_address=partner_address,
            partner_commission=partner_commission,
            partner_delete=partner_delete,
            txn=txn,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def gas(
        self,
        *,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """To fit more resources in app reference arrays.
        
        Adds a call to `gas()void` ABI method
        
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = GasArgs()
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def user_create(
        self,
        *,
        user_role: bytes | bytearray | tuple[int, int, int, int],
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Creates a new user data structure for the sender depending on the requested user role.
        
        Adds a call to `user_create(byte[4],pay)void` ABI method
        
        :param bytes | bytearray | tuple[int, int, int, int] user_role: Role to requested by the user. Possible options:     ROLE_VAL - user is a validator.     ROLE_DEL - user is a delegator.
        :param TransactionWithSigner txn: Payment transaction to cover MBR increase and user creation fee.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = UserCreateArgs(
            user_role=user_role,
            txn=txn,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def user_delete(
        self,
        *,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Clears the user's existing role on noticeboard.
        
        Adds a call to `user_delete()void` ABI method
        
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = UserDeleteArgs()
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def ad_create(
        self,
        *,
        val_app_idx: int,
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Creates a new validator ad for the sender (i.e. validator owner).
        
        Adds a call to `ad_create(uint64,pay)uint64` ABI method
        
        :param int val_app_idx: Index in the validator owner app list at which to place the newly created validator ad. This is to save on opcode cost instead of looping through the whole list.
        :param TransactionWithSigner txn: Transaction for the payment of the validator ad creation fee and all the MBR increases at Noticeboard and the newly created ValidatorAd.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = AdCreateArgs(
            val_app_idx=val_app_idx,
            txn=txn,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def ad_config(
        self,
        *,
        val_app: int,
        val_app_idx: int,
        val_manager: str,
        live: bool,
        cnt_del_max: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Sets all operation configuration parameters for the validator ad, i.e.
        the validator manager account, the status whether the ad is live to accept new delegators (`live=True`) or not (`live=False`), and the maximum number of delegators the validator ad can accept.
        
        Adds a call to `ad_config(application,uint64,address,bool,uint64)void` ABI method
        
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param str val_manager: Manager address for the validator ad.
        :param bool live: Set to True if the newly created validator ad should be accepting new delegators right away, otherwise set to False.
        :param int cnt_del_max: Maximum number of delegators the validator is willing to manage simultaneously.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = AdConfigArgs(
            val_app=val_app,
            val_app_idx=val_app_idx,
            val_manager=val_manager,
            live=live,
            cnt_del_max=cnt_del_max,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def ad_delete(
        self,
        *,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Validator owner deletes a validator ad.
        Possible only if there are no active delegators and all balances have been claimed.
        
        Adds a call to `ad_delete(application,uint64)void` ABI method
        
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = AdDeleteArgs(
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def ad_ready(
        self,
        *,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        ready: bool,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Ad manager sets its readiness for operation.
        
        Adds a call to `ad_ready(address,application,uint64,bool)void` ABI method
        
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param bool ready: Set to True if validator manager is ready for accepting new delegators, otherwise set to False.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = AdReadyArgs(
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
            ready=ready,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def ad_self_disclose(
        self,
        *,
        val_app: int,
        val_app_idx: int,
        val_info: ValidatorSelfDisclosure,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Ad owner sets its self-disclosure information.
        
        Adds a call to `ad_self_disclose(application,uint64,(byte[30],byte[60],byte[2],uint64,byte[20]))void` ABI method
        
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param ValidatorSelfDisclosure val_info: Self-disclosed information about the validator.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = AdSelfDiscloseArgs(
            val_app=val_app,
            val_app_idx=val_app_idx,
            val_info=val_info,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def ad_terms(
        self,
        *,
        val_app: int,
        val_app_idx: int,
        tc_sha256: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int],
        terms_time: ValidatorTermsTiming,
        terms_price: ValidatorTermsPricing,
        terms_stake: ValidatorTermsStakeLimits,
        terms_reqs: ValidatorTermsGating,
        terms_warn: ValidatorTermsWarnings,
        mbr_delegator_template_box: int,
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Sets all the terms for creating a delegation contract.
        With this action, the validator agrees with the (new) terms.
        
        Adds a call to `ad_terms(application,uint64,byte[32],(uint64,uint64,uint64,uint64,uint64),(uint64,uint64,uint64,uint64,uint64),(uint64,uint64),((uint64,uint64)[2]),(uint64,uint64),uint64,pay)void` ABI method
        
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int] tc_sha256: Hash (i.e. SHA 256) of the Terms and Conditions agreed by the validator.
        :param ValidatorTermsTiming terms_time: Validator's terms about timing.
        :param ValidatorTermsPricing terms_price: Validator's terms about pricing.
        :param ValidatorTermsStakeLimits terms_stake: Validator's terms about stake limits.
        :param ValidatorTermsGating terms_reqs: Validator's terms about gating requirements.
        :param ValidatorTermsWarnings terms_warn: Validator's terms about warnings.
        :param int mbr_delegator_template_box: Amount needed to pay to the validator ad for creating box for delegator template.
        :param TransactionWithSigner txn: Transaction for the payment of potential MBR increase of ValidatorAd in case of ASA opt-in and payment of box for delegator contract template box in case the ValidatorAd is in STATE_CREATED.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = AdTermsArgs(
            val_app=val_app,
            val_app_idx=val_app_idx,
            tc_sha256=tc_sha256,
            terms_time=terms_time,
            terms_price=terms_price,
            terms_stake=terms_stake,
            terms_reqs=terms_reqs,
            terms_warn=terms_warn,
            mbr_delegator_template_box=mbr_delegator_template_box,
            txn=txn,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def ad_income(
        self,
        *,
        val_app: int,
        val_app_idx: int,
        asset_id: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Validator owner withdraws all available balance from the validator ad for the given asset.
        
        Adds a call to `ad_income(application,uint64,uint64)uint64` ABI method
        
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param int asset_id: ID of the asset (i.e. ASA ID or 0 for ALGO) for which the owner would like to withdraw all earnings from the validator ad.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = AdIncomeArgs(
            val_app=val_app,
            val_app_idx=val_app_idx,
            asset_id=asset_id,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def ad_asa_close(
        self,
        *,
        val_app: int,
        val_app_idx: int,
        asset_id: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Removes the asset's storage on the validator ad.
        
        Adds a call to `ad_asa_close(application,uint64,uint64)void` ABI method
        
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param int asset_id: ID of the asset (i.e. ASA ID or 0 for ALGO) for which the owner would like to withdraw all earnings from the validator ad.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = AdAsaCloseArgs(
            val_app=val_app,
            val_app_idx=val_app_idx,
            asset_id=asset_id,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def contract_create(
        self,
        *,
        del_beneficiary: str,
        rounds_duration: int,
        stake_max: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        del_app_idx: int,
        tc_sha256: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int],
        partner_address: str,
        mbr_txn: TransactionWithSigner,
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Creates a new delegator contract for a delegator beneficiary with the given validator owner under the terms
        defined in the given ad for the input defined contract duration.
        
        Adds a call to `contract_create(address,uint64,uint64,address,application,uint64,uint64,byte[32],address,pay,txn)uint64` ABI method
        
        :param str del_beneficiary: Beneficiary address for the new delegation contract.
        :param int rounds_duration: Contract duration in number of rounds.
        :param int stake_max: The maximum amount of ALGO that the delegator beneficiary address intends to have at any point in time during the contract duration.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param int del_app_idx: Index of the delegator manager app list at which to store the new delegator contract. This is to save on opcode cost instead of looping through the whole list.
        :param bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int] tc_sha256: Hash (i.e. SHA 256) of the Terms and Conditions agreed by the delegator.
        :param str partner_address: Address of the partner that facilitated the contract creation. If there is no partner, set to Global.zero_address.
        :param TransactionWithSigner mbr_txn: Payment transaction for the payment of the increase of validator ad MBR due to creation of a new contract and payment of delegator contract creation fee.
        :param TransactionWithSigner txn: Transaction for the payment of the setup and operational fee.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = ContractCreateArgs(
            del_beneficiary=del_beneficiary,
            rounds_duration=rounds_duration,
            stake_max=stake_max,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
            del_app_idx=del_app_idx,
            tc_sha256=tc_sha256,
            partner_address=partner_address,
            mbr_txn=mbr_txn,
            txn=txn,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def keys_confirm(
        self,
        *,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Delegator manager confirms that the keys have been confirmed by the delegator beneficiary.
        
        Adds a call to `keys_confirm(application,uint64,address,application,uint64)void` ABI method
        
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = KeysConfirmArgs(
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def keys_not_confirmed(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Anyone confirms that delegator manager has not confirmed the confirmation of
        the keys by the delegator beneficiary and failed to pay the operational fee in the agreed time.
        
        Adds a call to `keys_not_confirmed(address,application,uint64,address,application,uint64)void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = KeysNotConfirmedArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def keys_not_submitted(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Anyone confirms that validator manager has not submitted the keys in the agreed time.
        Internally, the setup fee is returned to the delegator manager if possible.
        
        Adds a call to `keys_not_submitted(address,application,uint64,address,application,uint64)void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = KeysNotSubmittedArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def keys_submit(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        key_reg_txn_info: KeyRegTxnInfo,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Validator manager submits the keys generated for the delegator beneficiary.
        Internally, the setup fee is assigned to the validator.
        
        Adds a call to `keys_submit(address,application,uint64,address,application,uint64,(uint64,uint64,uint64,byte[32],byte[32],byte[64],address))void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param KeyRegTxnInfo key_reg_txn_info: Information about the generated participation keys.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = KeysSubmitArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
            key_reg_txn_info=key_reg_txn_info,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def breach_limits(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Reports that a limit breach event occurred on a delegator contract of a validator ad.
        
        Adds a call to `breach_limits(address,application,uint64,address,application,uint64)void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = BreachLimitsArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def breach_pay(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Reports that a payment cannot be made because the payment asset on a delegator contract
        have been either frozen or clawed back.
        
        Adds a call to `breach_pay(address,application,uint64,address,application,uint64)void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = BreachPayArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def breach_suspended(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Reports that the delegator beneficiary was suspended by consensus.
        
        Adds a call to `breach_suspended(address,application,uint64,address,application,uint64)void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = BreachSuspendedArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def contract_claim(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Claims the operational fee up to this round from a delegator contract and
        transfers it to the validator ad as well as the commission to the platform.
        
        Adds a call to `contract_claim(address,application,uint64,address,application,uint64)(uint64,uint64,uint64)` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = ContractClaimArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def contract_expired(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Reports that a delegator contract has expired.
        
        Adds a call to `contract_expired(address,application,uint64,address,application,uint64)void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = ContractExpiredArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def contract_withdraw(
        self,
        *,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Delegator manager gracefully withdraws from the delegator contract prematurely.
        
        Adds a call to `contract_withdraw(application,uint64,address,application,uint64)void` ABI method
        
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = ContractWithdrawArgs(
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def contract_delete(
        self,
        *,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Deletes a delegator contract.
        
        Adds a call to `contract_delete(application,uint64,address,application,uint64)(uint64,uint64)` ABI method
        
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = ContractDeleteArgs(
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def contract_report_expiry_soon(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Reports that the contract will expire soon.
        
        Adds a call to `contract_report_expiry_soon(address,application,uint64,address,application,uint64)void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = ContractReportExpirySoonArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def get_noticeboard_asset(
        self,
        *,
        asset_id: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Returns information about the payment asset that is or was accepted on the platform.
        
        Adds a call to `get_noticeboard_asset(uint64)(bool,uint64,uint64,uint64)` ABI method
        
        :param int asset_id: The `asset_id` ABI parameter
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = GetNoticeboardAssetArgs(
            asset_id=asset_id,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def get_noticeboard_user(
        self,
        *,
        user: str,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> "Composer":
        """Returns information about the user on the platform.
        
        Adds a call to `get_noticeboard_user(address)(byte[4],byte[8],address,address,uint64[110],uint64)` ABI method
        
        :param str user: The `user` ABI parameter
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = GetNoticeboardUserArgs(
            user=user,
        )
        self.app_client.compose_call(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return self

    def create_noticeboard_deploy(
        self,
        *,
        app_id_old: int,
        on_complete: typing.Literal["no_op"] = "no_op",
        transaction_parameters: algokit_utils.CreateTransactionParameters | None = None,
    ) -> "Composer":
        """Creates a new Noticeboard.
        
        Adds a call to `noticeboard_deploy(uint64)uint64` ABI method
        
        :param int app_id_old: The app ID of previous version of the platform.
        :param typing.Literal[no_op] on_complete: On completion type to use
        :param algokit_utils.CreateTransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns Composer: This Composer instance"""

        args = NoticeboardDeployArgs(
            app_id_old=app_id_old,
        )
        self.app_client.compose_create(
            self.atc,
            call_abi_method=args.method(),
            transaction_parameters=_convert_create_transaction_parameters(transaction_parameters, on_complete),
            **_as_dict(args, convert_all=True),
        )
        return self

    def clear_state(
        self,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
        app_args: list[bytes] | None = None,
    ) -> "Composer":
        """Adds a call to the application with on completion set to ClearState
    
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :param list[bytes] | None app_args: (optional) Application args to pass"""
    
        self.app_client.compose_clear_state(self.atc, _convert_transaction_parameters(transaction_parameters), app_args)
        return self


class NoticeboardClient:
    """
        Platform for peer-to-peer consensus delegation.
        Validators, i.e. node runners/operators, can post ads to offer their services to users.
        Delegators, i.e. users/ALGO holders, can open requests for the service and conclude a contract with a validator.
    
        Global state
        ------------
    
        pla_manager : Account
            Platform manager account.
    
        tc_sha256 : Sha256
            Hash (i.e. SHA 256) of the template of delegation contract concluded between the delegator and validator.
            This includes the Terms and Conditions.
            The template has placeholders corresponding to variable names of other contract terms defined in this structure.
    
        commission : UInt64
            Relative commission on any earning.
            It gets deducted from the earning and is paid to the platform.
            The value is represented in ppm.
            The maximum is 1_000_000.
    
        noticeboard_fees : NoticeboardFees
            Fees charged by the noticeboard.
        noticeboard_terms_timing : NoticeboardTermsTiming
            Noticeboard limits on timing terms for validator ads.
        noticeboard_terms_pricing : NoticeboardTermsPricing
            Noticeboard limits on pricing terms for validator ads.
        noticeboard_terms_node : NoticeboardTermsNodeLimits
            Noticeboard limits on node and related stake limit terms for validator ads.
    
        state : Bytes
            State of the contract. Can be one of the following:
                DEPLOYED - noticeboard contract has been deployed.
                SET - noticeboard has been set.
                RETIRED - noticeboard has been retired. Operations no new ads or contracts can be opened.
    
        app_id_old : UInt64
            The app ID of previous version of the platform.
        app_id_new : UInt64
            The app ID of next version of the platform.
    
        dll_val :  UsersDoubleLinkedList
            Information about the double linked list of validator users.
        dll_del :  UsersDoubleLinkedList
            Information about the double linked list of delegator users.
    
        Box storage
        -----------
        assets : asset_[asset_id] = NoticeboardAssetInfo
            Box map for storing assets that are or were supported by the noticeboard at any point of time as a means of
            payment between validators and delegators.
            Each entry is a NoticeboardAssetInfo, which is struct with fields:
                - a boolean marking whether the asset is currently accepted as payment (True) or not (False).
                - minimum pricing parameters for this asset.
            Keys correspond to "asset_" followed by byte representation of ASA ID or 0 for ALGO.
            Once an entry is created, it cannot be deleted.
    
        user : [arc4.Address] = UserInfo
            Box map for storing data about validator owner or delegator manager user.
            Each entry is a UserInfo, with fields for user role, list of app IDs and its counter, as well as
            the previous and next user of the same role in the linked list.
            Keys correspond to user address (32 Byte).
    
        template_del : BOX_DELEGATOR_CONTRACT_TEMPLATE_KEY = Byte
            Box for storing the delegator contract template.
    
        template_val : BOX_VALIDATOR_AD_TEMPLATE_KEY = Byte
            Box for storing the validator ad template.
    
        partner : partner_[arc4.Address] = PartnerInfo
            Box map for storing information about a partner of the platform.
            Each entry is a PartnerInfo, which includes a UInt64 with the partners commission in ppm.
            Keys correspond to "partner_" followed by partners address.
    
        Methods
        -------
        noticeboard_deploy(
            app_id_old: UInt64,
        ) -> arc4.UInt64:
            Creates a new Noticeboard.
    
        noticeboard_migrate(
            app_id_new: UInt64,
        ) -> None:
            Retires the current platform, preventing creation of new validator ads and modification of existing ones,
            as well as creation of new delegation contracts and updating of existing ones.
            Since retired platform cannot create new validator ads or modify existing ones, adding or removing
            an ASA is not needed anymore.
    
        noticeboard_set(
            pla_manager: Account,
            tc_sha256 : Sha256,
            noticeboard_fees : NoticeboardFees,
            noticeboard_terms_timing : NoticeboardTermsTiming,
            noticeboard_terms_pricing : NoticeboardTermsPricing,
            noticeboard_terms_node : NoticeboardTermsNodeLimits,
        ) -> None:
            Set (anew) all of the platform's operating parameters.
    
        noticeboard_key_reg(
            key_reg_info : KeyRegTxnInfo,
            txn : gtxn.PaymentTransaction,
        ) -> None:
            Issues a key (de)registration transaction by the platform.
    
        noticeboard_optin_asa(
            asa : Asset,
            sender : Account,
            txn : gtxn.PaymentTransaction,
        ) -> None:
            Opts the platform address in to an ASA.
    
        noticeboard_config_asset(
            asset_id : UInt64,
            asset_info : NoticeboardAssetInfo,
            txn : gtxn.PaymentTransaction,
        ) -> None:
            Adds or modifies an asset from the accepted payment methods.
    
        noticeboard_income(
            asset_id : UInt64,
        ) -> None:
            Sends all platform earnings of asset to platform manager account.
    
        template_load_init(
            name: arc4.Byte,
            template_size: UInt64,
        ) -> None:
            Starts the process of uploading a contract template.
    
        template_load_data(
            name: arc4.Byte,
            offset: UInt64,
            data: Bytes,
        ) -> None:
            Uploads a data chunk to a contract template.
    
        partner_config(
            partner_address: arc4.Address,
            partner_commission: UInt64,
            partner_delete: arc4.Bool,
            txn : gtxn.PaymentTransaction,
        ) -> None:
            Creates or modifies a platform's partner.
    
        gas(
        ) -> None:
            To fit more resources in app reference arrays.
    
        user_create(
            user_role : UInt64,
            txn : gtxn.PaymentTransaction,
        ) -> None:
            Creates a new user data structure for the sender depending on the requested user role.
    
        user_delete(
        ) -> None:
            Clears the user's existing role on noticeboard.
    
        contract_create(
            del_beneficiary: arc4.Address,
            rounds_duration: UInt64,
            stake_max: UInt64,
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
            del_app_idx: UInt64,
            tc_sha256: Sha256,
            partner_address: arc4.Address,
            mbr_txn: gtxn.PaymentTransaction,
            txn: gtxn.Transaction,
        ) -> arc4.UInt64:
    
        keys_confirm(
            del_app: Application,
            del_app_idx : UInt64,
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
        ) -> None:
            Delegator manager confirms that the keys have been confirmed by the delegator beneficiary.
    
        keys_not_confirmed(
            del_manager: arc4.Address,
            del_app: Application,
            del_app_idx : UInt64,
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
        ) -> None:
            Anyone confirms that delegator manager has not confirmed the confirmation of
            the keys by the delegator beneficiary and failed to pay the operational fee
            in the agreed time.
    
        keys_not_submitted(
            del_manager: arc4.Address,
            del_app: Application,
            del_app_idx : UInt64,
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
        ) -> None:
            Anyone confirms that validator manager has not submitted the keys in the agreed time.
    
        keys_submit(
            del_manager: arc4.Address,
            del_app: Application,
            del_app_idx : UInt64,
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
            key_reg_txn_info : KeyRegTxnInfo,
        ) -> None:
            Validator manager submits the keys generated for the delegator beneficiary.
    
        breach_limits(
            del_manager: arc4.Address,
            del_app: Application,
            del_app_idx : UInt64,
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
        ) -> None:
            Reports that a limit breach event occurred on a delegator contract of a validator ad.
    
        breach_pay(
            del_manager: arc4.Address,
            del_app: Application,
            del_app_idx : UInt64,
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
        ) -> None:
            Reports that a payment cannot be made because the payment asset on a delegator contract
            have been either frozen or clawed back.
    
        breach_suspended(
            del_manager: arc4.Address,
            del_app: Application,
            del_app_idx : UInt64,
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
        ) -> None:
            Reports that the delegator beneficiary was suspended by consensus.
    
        contract_claim(
            del_manager: arc4.Address,
            del_app: Application,
            del_app_idx : UInt64,
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
        ) -> EarningsDistribution:
            Claims the operational fee up to this round from a delegator contract and
            transfers it to the validator ad as well as the commission to the platform.
    
        contract_expired(
            del_manager: arc4.Address,
            del_app: Application,
            del_app_idx : UInt64,
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
        ) -> None:
            Reports that a delegator contract has expired.
    
        contract_withdraw(
            del_app: Application,
            del_app_idx : UInt64,
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
        ) -> None:
            Delegator manager gracefully withdraws from the delegator contract prematurely.
    
        contract_delete(
            del_app: Application,
            del_app_idx : UInt64,
        ) -> ContractDeleteReturn:
            Deletes a delegator contract.
    
        contract_report_expiry_soon(
            del_manager: arc4.Address,
            del_app: Application,
            del_app_idx : UInt64,
        ) -> None:
            Reports that the contract will expire soon.
    
        ad_create(
            val_app_idx: UInt64,
            terms_time: ValidatorTermsTiming,
            terms_price: ValidatorTermsPricing,
            terms_stake: ValidatorTermsStakeLimits,
            terms_reqs: ValidatorTermsGating,
            terms_warn: ValidatorTermsWarnings,
            val_manager: arc4.Address,
            live : arc4.Bool,
            cnt_del_max : UInt64,
            val_info: ValidatorSelfDisclosure,
            mbr_delegator_template_box: UInt64,
            txn: gtxn.PaymentTransaction,
        ) -> arc4.UInt64:
            Creates a new validator ad for the sender (i.e. validator owner).
    
        ad_config(
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
            val_manager: arc4.Address,
            live : arc4.Bool,
            cnt_del_max : UInt64,
        ) -> None:
            Sets all operation configuration parameters for the validator ad
    
        ad_delete(
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
        ) -> None:
            Validator owner deletes a validator ad.
    
        ad_ready(
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
            ready: arc4.Bool,
        ) -> None:
            Ad manager sets its readiness for operation.
    
        ad_self_disclose(
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
            val_info: ValidatorSelfDisclosure,
        ) -> None:
            Ad owner sets its self-disclosure information.
    
        ad_terms(
            val_owner: arc4.Address,
            val_app: Application,
            val_app_idx: UInt64,
            terms_time: ValidatorTermsTiming,
            terms_price: ValidatorTermsPricing,
            terms_stake: ValidatorTermsStakeLimits,
            terms_reqs: ValidatorTermsGating,
            terms_warn: ValidatorTermsWarnings,
            txn: gtxn.PaymentTransaction,
        ) -> None:
            Sets all the terms for creating a delegation contract.
    
        ad_income(
            val_app: Application,
            val_app_idx: UInt64,
            asset_id: UInt64,
        ) -> arc4.UInt64:
            Validator owner withdraws all available balance from the validator ad for the given asset.
    
        ad_asa_close(
            val_app: Application,
            val_app_idx: UInt64,
            asset_id: UInt64,
        ) -> None:
            Removes the asset's storage on the validator ad.
    
        get_noticeboard_asset(
            asset_id : UInt64,
        ) -> NoticeboardAssetInfo:
            Returns information about the payment asset that is or was accepted on the platform.
    
        get_noticeboard_user(
            user : arc4.Address,
        ) -> UserInfo:
            Returns information about the user on the platform.
    
        
    
    A class for interacting with the Noticeboard app providing high productivity and
    strongly typed methods to deploy and call the app"""

    @typing.overload
    def __init__(
        self,
        algod_client: algosdk.v2client.algod.AlgodClient,
        *,
        app_id: int = 0,
        signer: TransactionSigner | algokit_utils.Account | None = None,
        sender: str | None = None,
        suggested_params: algosdk.transaction.SuggestedParams | None = None,
        template_values: algokit_utils.TemplateValueMapping | None = None,
        app_name: str | None = None,
    ) -> None:
        ...

    @typing.overload
    def __init__(
        self,
        algod_client: algosdk.v2client.algod.AlgodClient,
        *,
        creator: str | algokit_utils.Account,
        indexer_client: algosdk.v2client.indexer.IndexerClient | None = None,
        existing_deployments: algokit_utils.AppLookup | None = None,
        signer: TransactionSigner | algokit_utils.Account | None = None,
        sender: str | None = None,
        suggested_params: algosdk.transaction.SuggestedParams | None = None,
        template_values: algokit_utils.TemplateValueMapping | None = None,
        app_name: str | None = None,
    ) -> None:
        ...

    def __init__(
        self,
        algod_client: algosdk.v2client.algod.AlgodClient,
        *,
        creator: str | algokit_utils.Account | None = None,
        indexer_client: algosdk.v2client.indexer.IndexerClient | None = None,
        existing_deployments: algokit_utils.AppLookup | None = None,
        app_id: int = 0,
        signer: TransactionSigner | algokit_utils.Account | None = None,
        sender: str | None = None,
        suggested_params: algosdk.transaction.SuggestedParams | None = None,
        template_values: algokit_utils.TemplateValueMapping | None = None,
        app_name: str | None = None,
    ) -> None:
        """
        NoticeboardClient can be created with an app_id to interact with an existing application, alternatively
        it can be created with a creator and indexer_client specified to find existing applications by name and creator.
        
        :param AlgodClient algod_client: AlgoSDK algod client
        :param int app_id: The app_id of an existing application, to instead find the application by creator and name
        use the creator and indexer_client parameters
        :param str | Account creator: The address or Account of the app creator to resolve the app_id
        :param IndexerClient indexer_client: AlgoSDK indexer client, only required if deploying or finding app_id by
        creator and app name
        :param AppLookup existing_deployments:
        :param TransactionSigner | Account signer: Account or signer to use to sign transactions, if not specified and
        creator was passed as an Account will use that.
        :param str sender: Address to use as the sender for all transactions, will use the address associated with the
        signer if not specified.
        :param TemplateValueMapping template_values: Values to use for TMPL_* template variables, dictionary keys should
        *NOT* include the TMPL_ prefix
        :param str | None app_name: Name of application to use when deploying, defaults to name defined on the
        Application Specification
            """

        self.app_spec = APP_SPEC
        
        # calling full __init__ signature, so ignoring mypy warning about overloads
        self.app_client = algokit_utils.ApplicationClient(  # type: ignore[call-overload, misc]
            algod_client=algod_client,
            app_spec=self.app_spec,
            app_id=app_id,
            creator=creator,
            indexer_client=indexer_client,
            existing_deployments=existing_deployments,
            signer=signer,
            sender=sender,
            suggested_params=suggested_params,
            template_values=template_values,
            app_name=app_name,
        )

    @property
    def algod_client(self) -> algosdk.v2client.algod.AlgodClient:
        return self.app_client.algod_client

    @property
    def app_id(self) -> int:
        return self.app_client.app_id

    @app_id.setter
    def app_id(self, value: int) -> None:
        self.app_client.app_id = value

    @property
    def app_address(self) -> str:
        return self.app_client.app_address

    @property
    def sender(self) -> str | None:
        return self.app_client.sender

    @sender.setter
    def sender(self, value: str) -> None:
        self.app_client.sender = value

    @property
    def signer(self) -> TransactionSigner | None:
        return self.app_client.signer

    @signer.setter
    def signer(self, value: TransactionSigner) -> None:
        self.app_client.signer = value

    @property
    def suggested_params(self) -> algosdk.transaction.SuggestedParams | None:
        return self.app_client.suggested_params

    @suggested_params.setter
    def suggested_params(self, value: algosdk.transaction.SuggestedParams | None) -> None:
        self.app_client.suggested_params = value

    def get_global_state(self) -> GlobalState:
        """Returns the application's global state wrapped in a strongly typed class with options to format the stored value"""

        state = typing.cast(dict[bytes, bytes | int], self.app_client.get_global_state(raw=True))
        return GlobalState(state)

    def noticeboard_migrate(
        self,
        *,
        app_id_new: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Retires the current platform, preventing creation of new validator ads and modification of existing ones,
        as well as creation of new delegation contracts and updating of existing ones. Since retired platform cannot create new validator ads or modify existing ones, adding or removing an ASA is not needed anymore.
        
        Calls `noticeboard_migrate(uint64)void` ABI method
        
        :param int app_id_new: The app ID of next version of the platform.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = NoticeboardMigrateArgs(
            app_id_new=app_id_new,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def noticeboard_set(
        self,
        *,
        pla_manager: str | bytes,
        tc_sha256: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int],
        noticeboard_fees: NoticeboardFees,
        noticeboard_terms_timing: NoticeboardTermsTiming,
        noticeboard_terms_pricing: NoticeboardTermsPricing,
        noticeboard_terms_node: NoticeboardTermsNodeLimits,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Set (anew) all of the platform's operating parameters.
        
        Calls `noticeboard_set(account,byte[32],(uint64,uint64,uint64,uint64),(uint64,uint64,uint64,uint64),(uint64),(uint64,uint64))void` ABI method
        
        :param str | bytes pla_manager: Platform manager account.
        :param bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int] tc_sha256: Hash (i.e. SHA 256) of the template of delegation contract concluded between the delegator and validator. This includes the Terms and Conditions. The template has placeholders corresponding to variable names of contract terms defined in this structure.
        :param NoticeboardFees noticeboard_fees: Fees charged by the noticeboard.
        :param NoticeboardTermsTiming noticeboard_terms_timing: Noticeboard limits on timing terms for validator ads.
        :param NoticeboardTermsPricing noticeboard_terms_pricing: Noticeboard limits on pricing terms for validator ads.
        :param NoticeboardTermsNodeLimits noticeboard_terms_node: Noticeboard limits on node and related stake limit terms for validator ads.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = NoticeboardSetArgs(
            pla_manager=pla_manager,
            tc_sha256=tc_sha256,
            noticeboard_fees=noticeboard_fees,
            noticeboard_terms_timing=noticeboard_terms_timing,
            noticeboard_terms_pricing=noticeboard_terms_pricing,
            noticeboard_terms_node=noticeboard_terms_node,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def noticeboard_key_reg(
        self,
        *,
        key_reg_info: KeyRegTxnInfo,
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Issues a key (de)registration transaction by the platform.
        
        Calls `noticeboard_key_reg((uint64,uint64,uint64,byte[32],byte[32],byte[64],address),pay)void` ABI method
        
        :param KeyRegTxnInfo key_reg_info: Key registration information to send.
        :param TransactionWithSigner txn: Payment transaction to cover costs for the key (de)registration fee.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = NoticeboardKeyRegArgs(
            key_reg_info=key_reg_info,
            txn=txn,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def noticeboard_optin_asa(
        self,
        *,
        asa: int,
        sender: str | bytes,
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Opts the platform address in to an ASA.
        
        Calls `noticeboard_optin_asa(asset,account,pay)void` ABI method
        
        :param int asa: Asset to opt into.
        :param str | bytes sender: Account to opt into the asa.
        :param TransactionWithSigner txn: Payment transaction to cover MBR increase.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = NoticeboardOptinAsaArgs(
            asa=asa,
            sender=sender,
            txn=txn,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def noticeboard_config_asset(
        self,
        *,
        asset_id: int,
        asset_info: NoticeboardAssetInfo,
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Adds or modifies an asset from the accepted payment methods.
        
        Calls `noticeboard_config_asset(uint64,(bool,uint64,uint64,uint64),pay)void` ABI method
        
        :param int asset_id: ID of asset to add or modify as an accepted payment method, i.e. ASA ID or 0 for ALGO.
        :param NoticeboardAssetInfo asset_info: Information about the payment asset, i.e. if it is accepted as a payment at the platform (True) or not (False), and its minimum pricing limits.
        :param TransactionWithSigner txn: Payment transaction to cover (potential) MBR increase.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = NoticeboardConfigAssetArgs(
            asset_id=asset_id,
            asset_info=asset_info,
            txn=txn,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def noticeboard_income(
        self,
        *,
        asset_id: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Sends all platform earnings of asset to platform manager account.
        
        Calls `noticeboard_income(uint64)void` ABI method
        
        :param int asset_id: ID of asset to withdraw all earnings.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = NoticeboardIncomeArgs(
            asset_id=asset_id,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def template_load_init(
        self,
        *,
        name: int,
        template_size: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Starts the process of uploading a contract template.
        
        Calls `template_load_init(byte,uint64)void` ABI method
        
        :param int name: Name of the box with the contract template.
        :param int template_size: Size of the delegator contract template in bytes.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = TemplateLoadInitArgs(
            name=name,
            template_size=template_size,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def template_load_data(
        self,
        *,
        name: int,
        offset: int,
        data: bytes | bytearray,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Uploads a data chunk to a contract template.
        
        Calls `template_load_data(byte,uint64,byte[])void` ABI method
        
        :param int name: Name of the box with the contract template.
        :param int offset: Offset in the box at which to replace the data.
        :param bytes | bytearray data: Data to replace in the box at the defined position.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = TemplateLoadDataArgs(
            name=name,
            offset=offset,
            data=data,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def partner_config(
        self,
        *,
        partner_address: str,
        partner_commission: int,
        partner_delete: bool,
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Creates or modifies a platform's partner.
        
        Calls `partner_config(address,uint64,bool,pay)void` ABI method
        
        :param str partner_address: Address of the partner to register on the platform.
        :param int partner_commission: Partner's convenience fee, i.e. relative commission, charged on top of validator price for partner's convenience offer. The value is represented in ppm.
        :param bool partner_delete: Boolean set to true to delete the partner from the platform, otherwise create or modify it.
        :param TransactionWithSigner txn: Payment transaction to cover (potential) MBR increase.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = PartnerConfigArgs(
            partner_address=partner_address,
            partner_commission=partner_commission,
            partner_delete=partner_delete,
            txn=txn,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def gas(
        self,
        *,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """To fit more resources in app reference arrays.
        
        Calls `gas()void` ABI method
        
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = GasArgs()
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def user_create(
        self,
        *,
        user_role: bytes | bytearray | tuple[int, int, int, int],
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Creates a new user data structure for the sender depending on the requested user role.
        
        Calls `user_create(byte[4],pay)void` ABI method
        
        :param bytes | bytearray | tuple[int, int, int, int] user_role: Role to requested by the user. Possible options:     ROLE_VAL - user is a validator.     ROLE_DEL - user is a delegator.
        :param TransactionWithSigner txn: Payment transaction to cover MBR increase and user creation fee.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = UserCreateArgs(
            user_role=user_role,
            txn=txn,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def user_delete(
        self,
        *,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Clears the user's existing role on noticeboard.
        
        Calls `user_delete()void` ABI method
        
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = UserDeleteArgs()
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def ad_create(
        self,
        *,
        val_app_idx: int,
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[int]:
        """Creates a new validator ad for the sender (i.e. validator owner).
        
        Calls `ad_create(uint64,pay)uint64` ABI method
        
        :param int val_app_idx: Index in the validator owner app list at which to place the newly created validator ad. This is to save on opcode cost instead of looping through the whole list.
        :param TransactionWithSigner txn: Transaction for the payment of the validator ad creation fee and all the MBR increases at Noticeboard and the newly created ValidatorAd.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[int]: App ID of the created validator ad application."""

        args = AdCreateArgs(
            val_app_idx=val_app_idx,
            txn=txn,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def ad_config(
        self,
        *,
        val_app: int,
        val_app_idx: int,
        val_manager: str,
        live: bool,
        cnt_del_max: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Sets all operation configuration parameters for the validator ad, i.e.
        the validator manager account, the status whether the ad is live to accept new delegators (`live=True`) or not (`live=False`), and the maximum number of delegators the validator ad can accept.
        
        Calls `ad_config(application,uint64,address,bool,uint64)void` ABI method
        
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param str val_manager: Manager address for the validator ad.
        :param bool live: Set to True if the newly created validator ad should be accepting new delegators right away, otherwise set to False.
        :param int cnt_del_max: Maximum number of delegators the validator is willing to manage simultaneously.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = AdConfigArgs(
            val_app=val_app,
            val_app_idx=val_app_idx,
            val_manager=val_manager,
            live=live,
            cnt_del_max=cnt_del_max,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def ad_delete(
        self,
        *,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Validator owner deletes a validator ad.
        Possible only if there are no active delegators and all balances have been claimed.
        
        Calls `ad_delete(application,uint64)void` ABI method
        
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = AdDeleteArgs(
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def ad_ready(
        self,
        *,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        ready: bool,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Ad manager sets its readiness for operation.
        
        Calls `ad_ready(address,application,uint64,bool)void` ABI method
        
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param bool ready: Set to True if validator manager is ready for accepting new delegators, otherwise set to False.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = AdReadyArgs(
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
            ready=ready,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def ad_self_disclose(
        self,
        *,
        val_app: int,
        val_app_idx: int,
        val_info: ValidatorSelfDisclosure,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Ad owner sets its self-disclosure information.
        
        Calls `ad_self_disclose(application,uint64,(byte[30],byte[60],byte[2],uint64,byte[20]))void` ABI method
        
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param ValidatorSelfDisclosure val_info: Self-disclosed information about the validator.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = AdSelfDiscloseArgs(
            val_app=val_app,
            val_app_idx=val_app_idx,
            val_info=val_info,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def ad_terms(
        self,
        *,
        val_app: int,
        val_app_idx: int,
        tc_sha256: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int],
        terms_time: ValidatorTermsTiming,
        terms_price: ValidatorTermsPricing,
        terms_stake: ValidatorTermsStakeLimits,
        terms_reqs: ValidatorTermsGating,
        terms_warn: ValidatorTermsWarnings,
        mbr_delegator_template_box: int,
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Sets all the terms for creating a delegation contract.
        With this action, the validator agrees with the (new) terms.
        
        Calls `ad_terms(application,uint64,byte[32],(uint64,uint64,uint64,uint64,uint64),(uint64,uint64,uint64,uint64,uint64),(uint64,uint64),((uint64,uint64)[2]),(uint64,uint64),uint64,pay)void` ABI method
        
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int] tc_sha256: Hash (i.e. SHA 256) of the Terms and Conditions agreed by the validator.
        :param ValidatorTermsTiming terms_time: Validator's terms about timing.
        :param ValidatorTermsPricing terms_price: Validator's terms about pricing.
        :param ValidatorTermsStakeLimits terms_stake: Validator's terms about stake limits.
        :param ValidatorTermsGating terms_reqs: Validator's terms about gating requirements.
        :param ValidatorTermsWarnings terms_warn: Validator's terms about warnings.
        :param int mbr_delegator_template_box: Amount needed to pay to the validator ad for creating box for delegator template.
        :param TransactionWithSigner txn: Transaction for the payment of potential MBR increase of ValidatorAd in case of ASA opt-in and payment of box for delegator contract template box in case the ValidatorAd is in STATE_CREATED.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = AdTermsArgs(
            val_app=val_app,
            val_app_idx=val_app_idx,
            tc_sha256=tc_sha256,
            terms_time=terms_time,
            terms_price=terms_price,
            terms_stake=terms_stake,
            terms_reqs=terms_reqs,
            terms_warn=terms_warn,
            mbr_delegator_template_box=mbr_delegator_template_box,
            txn=txn,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def ad_income(
        self,
        *,
        val_app: int,
        val_app_idx: int,
        asset_id: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[int]:
        """Validator owner withdraws all available balance from the validator ad for the given asset.
        
        Calls `ad_income(application,uint64,uint64)uint64` ABI method
        
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param int asset_id: ID of the asset (i.e. ASA ID or 0 for ALGO) for which the owner would like to withdraw all earnings from the validator ad.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[int]: Withdrawn income from the validator ad for the input asset."""

        args = AdIncomeArgs(
            val_app=val_app,
            val_app_idx=val_app_idx,
            asset_id=asset_id,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def ad_asa_close(
        self,
        *,
        val_app: int,
        val_app_idx: int,
        asset_id: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Removes the asset's storage on the validator ad.
        
        Calls `ad_asa_close(application,uint64,uint64)void` ABI method
        
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param int asset_id: ID of the asset (i.e. ASA ID or 0 for ALGO) for which the owner would like to withdraw all earnings from the validator ad.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = AdAsaCloseArgs(
            val_app=val_app,
            val_app_idx=val_app_idx,
            asset_id=asset_id,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def contract_create(
        self,
        *,
        del_beneficiary: str,
        rounds_duration: int,
        stake_max: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        del_app_idx: int,
        tc_sha256: bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int],
        partner_address: str,
        mbr_txn: TransactionWithSigner,
        txn: TransactionWithSigner,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[int]:
        """Creates a new delegator contract for a delegator beneficiary with the given validator owner under the terms
        defined in the given ad for the input defined contract duration.
        
        Calls `contract_create(address,uint64,uint64,address,application,uint64,uint64,byte[32],address,pay,txn)uint64` ABI method
        
        :param str del_beneficiary: Beneficiary address for the new delegation contract.
        :param int rounds_duration: Contract duration in number of rounds.
        :param int stake_max: The maximum amount of ALGO that the delegator beneficiary address intends to have at any point in time during the contract duration.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param int del_app_idx: Index of the delegator manager app list at which to store the new delegator contract. This is to save on opcode cost instead of looping through the whole list.
        :param bytes | bytearray | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int] tc_sha256: Hash (i.e. SHA 256) of the Terms and Conditions agreed by the delegator.
        :param str partner_address: Address of the partner that facilitated the contract creation. If there is no partner, set to Global.zero_address.
        :param TransactionWithSigner mbr_txn: Payment transaction for the payment of the increase of validator ad MBR due to creation of a new contract and payment of delegator contract creation fee.
        :param TransactionWithSigner txn: Transaction for the payment of the setup and operational fee.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[int]: App ID of the created delegator contract application."""

        args = ContractCreateArgs(
            del_beneficiary=del_beneficiary,
            rounds_duration=rounds_duration,
            stake_max=stake_max,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
            del_app_idx=del_app_idx,
            tc_sha256=tc_sha256,
            partner_address=partner_address,
            mbr_txn=mbr_txn,
            txn=txn,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def keys_confirm(
        self,
        *,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Delegator manager confirms that the keys have been confirmed by the delegator beneficiary.
        
        Calls `keys_confirm(application,uint64,address,application,uint64)void` ABI method
        
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = KeysConfirmArgs(
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def keys_not_confirmed(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Anyone confirms that delegator manager has not confirmed the confirmation of
        the keys by the delegator beneficiary and failed to pay the operational fee in the agreed time.
        
        Calls `keys_not_confirmed(address,application,uint64,address,application,uint64)void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = KeysNotConfirmedArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def keys_not_submitted(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Anyone confirms that validator manager has not submitted the keys in the agreed time.
        Internally, the setup fee is returned to the delegator manager if possible.
        
        Calls `keys_not_submitted(address,application,uint64,address,application,uint64)void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = KeysNotSubmittedArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def keys_submit(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        key_reg_txn_info: KeyRegTxnInfo,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Validator manager submits the keys generated for the delegator beneficiary.
        Internally, the setup fee is assigned to the validator.
        
        Calls `keys_submit(address,application,uint64,address,application,uint64,(uint64,uint64,uint64,byte[32],byte[32],byte[64],address))void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param KeyRegTxnInfo key_reg_txn_info: Information about the generated participation keys.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = KeysSubmitArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
            key_reg_txn_info=key_reg_txn_info,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def breach_limits(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Reports that a limit breach event occurred on a delegator contract of a validator ad.
        
        Calls `breach_limits(address,application,uint64,address,application,uint64)void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = BreachLimitsArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def breach_pay(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Reports that a payment cannot be made because the payment asset on a delegator contract
        have been either frozen or clawed back.
        
        Calls `breach_pay(address,application,uint64,address,application,uint64)void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = BreachPayArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def breach_suspended(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Reports that the delegator beneficiary was suspended by consensus.
        
        Calls `breach_suspended(address,application,uint64,address,application,uint64)void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = BreachSuspendedArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def contract_claim(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[EarningsDistribution]:
        """Claims the operational fee up to this round from a delegator contract and
        transfers it to the validator ad as well as the commission to the platform.
        
        Calls `contract_claim(address,application,uint64,address,application,uint64)(uint64,uint64,uint64)` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[EarningsDistribution]: The result of the transaction"""

        args = ContractClaimArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        elements = self.app_spec.hints[args.method()].structs["output"]["elements"]
        result_dict = {element[0]: value for element, value in zip(elements, result.return_value)}
        result.return_value = EarningsDistribution(**result_dict)
        return result

    def contract_expired(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Reports that a delegator contract has expired.
        
        Calls `contract_expired(address,application,uint64,address,application,uint64)void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = ContractExpiredArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def contract_withdraw(
        self,
        *,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Delegator manager gracefully withdraws from the delegator contract prematurely.
        
        Calls `contract_withdraw(application,uint64,address,application,uint64)void` ABI method
        
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = ContractWithdrawArgs(
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def contract_delete(
        self,
        *,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[ContractDeleteReturn]:
        """Deletes a delegator contract.
        
        Calls `contract_delete(application,uint64,address,application,uint64)(uint64,uint64)` ABI method
        
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[ContractDeleteReturn]: Balance of the fee asset that remained in the delegator contract."""

        args = ContractDeleteArgs(
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        elements = self.app_spec.hints[args.method()].structs["output"]["elements"]
        result_dict = {element[0]: value for element, value in zip(elements, result.return_value)}
        result.return_value = ContractDeleteReturn(**result_dict)
        return result

    def contract_report_expiry_soon(
        self,
        *,
        del_manager: str,
        del_app: int,
        del_app_idx: int,
        val_owner: str,
        val_app: int,
        val_app_idx: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[None]:
        """Reports that the contract will expire soon.
        
        Calls `contract_report_expiry_soon(address,application,uint64,address,application,uint64)void` ABI method
        
        :param str del_manager: Manager address for the delegation contract.
        :param int del_app: App ID of the delegator contract.
        :param int del_app_idx: Index of the delegator manager app list at which the delegator contract is stored. This is to save on opcode cost instead of looping through the whole list.
        :param str val_owner: Owner address for the validator ad.
        :param int val_app: App ID of the validator ad.
        :param int val_app_idx: Index of the requested validator ad in validator owner app list. This is to save on opcode cost instead of looping through the whole list.
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[None]: The result of the transaction"""

        args = ContractReportExpirySoonArgs(
            del_manager=del_manager,
            del_app=del_app,
            del_app_idx=del_app_idx,
            val_owner=val_owner,
            val_app=val_app,
            val_app_idx=val_app_idx,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        return result

    def get_noticeboard_asset(
        self,
        *,
        asset_id: int,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[NoticeboardAssetInfo]:
        """Returns information about the payment asset that is or was accepted on the platform.
        
        Calls `get_noticeboard_asset(uint64)(bool,uint64,uint64,uint64)` ABI method
        
        :param int asset_id: The `asset_id` ABI parameter
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[NoticeboardAssetInfo]: Information about the payment asset that is or was accepted on the platform."""

        args = GetNoticeboardAssetArgs(
            asset_id=asset_id,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        elements = self.app_spec.hints[args.method()].structs["output"]["elements"]
        result_dict = {element[0]: value for element, value in zip(elements, result.return_value)}
        result.return_value = NoticeboardAssetInfo(**result_dict)
        return result

    def get_noticeboard_user(
        self,
        *,
        user: str,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[UserInfo]:
        """Returns information about the user on the platform.
        
        Calls `get_noticeboard_user(address)(byte[4],byte[8],address,address,uint64[110],uint64)` ABI method
        
        :param str user: The `user` ABI parameter
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[UserInfo]: Information about the user on the platform."""

        args = GetNoticeboardUserArgs(
            user=user,
        )
        result = self.app_client.call(
            call_abi_method=args.method(),
            transaction_parameters=_convert_call_transaction_parameters(transaction_parameters),
            **_as_dict(args, convert_all=True),
        )
        elements = self.app_spec.hints[args.method()].structs["output"]["elements"]
        result_dict = {element[0]: value for element, value in zip(elements, result.return_value)}
        result.return_value = UserInfo(**result_dict)
        return result

    def create_noticeboard_deploy(
        self,
        *,
        app_id_old: int,
        on_complete: typing.Literal["no_op"] = "no_op",
        transaction_parameters: algokit_utils.CreateTransactionParameters | None = None,
    ) -> algokit_utils.ABITransactionResponse[int]:
        """Creates a new Noticeboard.
        
        Calls `noticeboard_deploy(uint64)uint64` ABI method
        
        :param int app_id_old: The app ID of previous version of the platform.
        :param typing.Literal[no_op] on_complete: On completion type to use
        :param algokit_utils.CreateTransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :returns algokit_utils.ABITransactionResponse[int]: App ID of the created noticeboard application."""

        args = NoticeboardDeployArgs(
            app_id_old=app_id_old,
        )
        result = self.app_client.create(
            call_abi_method=args.method(),
            transaction_parameters=_convert_create_transaction_parameters(transaction_parameters, on_complete),
            **_as_dict(args, convert_all=True),
        )
        return result

    def clear_state(
        self,
        transaction_parameters: algokit_utils.TransactionParameters | None = None,
        app_args: list[bytes] | None = None,
    ) -> algokit_utils.TransactionResponse:
        """Calls the application with on completion set to ClearState
    
        :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters
        :param list[bytes] | None app_args: (optional) Application args to pass
        :returns algokit_utils.TransactionResponse: The result of the transaction"""
    
        return self.app_client.clear_state(_convert_transaction_parameters(transaction_parameters), app_args)

    def deploy(
        self,
        version: str | None = None,
        *,
        signer: TransactionSigner | None = None,
        sender: str | None = None,
        allow_update: bool | None = None,
        allow_delete: bool | None = None,
        on_update: algokit_utils.OnUpdate = algokit_utils.OnUpdate.Fail,
        on_schema_break: algokit_utils.OnSchemaBreak = algokit_utils.OnSchemaBreak.Fail,
        template_values: algokit_utils.TemplateValueMapping | None = None,
        create_args: DeployCreate[NoticeboardDeployArgs],
        update_args: algokit_utils.DeployCallArgs | None = None,
        delete_args: algokit_utils.DeployCallArgs | None = None,
    ) -> algokit_utils.DeployResponse:
        """Deploy an application and update client to reference it.
        
        Idempotently deploy (create, update/delete if changed) an app against the given name via the given creator
        account, including deploy-time template placeholder substitutions.
        To understand the architecture decisions behind this functionality please see
        <https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md>
        
        ```{note}
        If there is a breaking state schema change to an existing app (and `on_schema_break` is set to
        'ReplaceApp' the existing app will be deleted and re-created.
        ```
        
        ```{note}
        If there is an update (different TEAL code) to an existing app (and `on_update` is set to 'ReplaceApp')
        the existing app will be deleted and re-created.
        ```
        
        :param str version: version to use when creating or updating app, if None version will be auto incremented
        :param algosdk.atomic_transaction_composer.TransactionSigner signer: signer to use when deploying app
        , if None uses self.signer
        :param str sender: sender address to use when deploying app, if None uses self.sender
        :param bool allow_delete: Used to set the `TMPL_DELETABLE` template variable to conditionally control if an app
        can be deleted
        :param bool allow_update: Used to set the `TMPL_UPDATABLE` template variable to conditionally control if an app
        can be updated
        :param OnUpdate on_update: Determines what action to take if an application update is required
        :param OnSchemaBreak on_schema_break: Determines what action to take if an application schema requirements
        has increased beyond the current allocation
        :param dict[str, int|str|bytes] template_values: Values to use for `TMPL_*` template variables, dictionary keys
        should *NOT* include the TMPL_ prefix
        :param DeployCreate[NoticeboardDeployArgs] create_args: Arguments used when creating an application
        :param algokit_utils.DeployCallArgs | None update_args: Arguments used when updating an application
        :param algokit_utils.DeployCallArgs | None delete_args: Arguments used when deleting an application
        :return DeployResponse: details action taken and relevant transactions
        :raises DeploymentError: If the deployment failed"""

        return self.app_client.deploy(
            version,
            signer=signer,
            sender=sender,
            allow_update=allow_update,
            allow_delete=allow_delete,
            on_update=on_update,
            on_schema_break=on_schema_break,
            template_values=template_values,
            create_args=_convert_deploy_args(create_args),
            update_args=_convert_deploy_args(update_args),
            delete_args=_convert_deploy_args(delete_args),
        )

    def compose(self, atc: AtomicTransactionComposer | None = None) -> Composer:
        return Composer(self.app_client, atc or AtomicTransactionComposer())
