Skip to content

Instantly share code, notes, and snippets.

@30mb1
Created June 6, 2024 20:23
Show Gist options
  • Save 30mb1/b6665a5dfaa6ef5762f7c4ddc841339a to your computer and use it in GitHub Desktop.
Save 30mb1/b6665a5dfaa6ef5762f7c4ddc841339a to your computer and use it in GitHub Desktop.
import nekoton as _nt
_giver_v2_abi = _nt.ContractAbi("""{"ABI version": 2,
"header": ["time", "expire"],
"functions": [
{
"name": "upgrade",
"inputs": [
{"name":"newcode","type":"cell"}
],
"outputs": [
]
},
{
"name": "sendTransaction",
"inputs": [
{"name":"dest","type":"address"},
{"name":"value","type":"uint128"},
{"name":"bounce","type":"bool"}
],
"outputs": [
]
},
{
"name": "getMessages",
"inputs": [
],
"outputs": [
{"components":[{"name":"hash","type":"uint256"},{"name":"expireAt","type":"uint64"}],"name":"messages","type":"tuple[]"}
]
},
{
"name": "constructor",
"inputs": [
],
"outputs": [
]
}
],
"events": [
]
}""")
_giver_v2_constructor = _giver_v2_abi.get_function("constructor")
_giver_v2_send_grams = _giver_v2_abi.get_function("sendTransaction")
_giver_v2_tvc = "te6ccgECIAEAA6YAAgE0BgEBAcACAgPPIAUDAQHeBAAD0CAAQdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAIm/wD0pCAiwAGS9KDhiu1TWDD0oQkHAQr0pCD0oQgAAAIBIA0KAQL/CwH+fyHtRNAg10nCAZ/T/9MA9AX4an/4Yfhm+GKOG/QFbfhqcAGAQPQO8r3XC//4YnD4Y3D4Zn/4YeLTAAGOEoECANcYIPkBWPhCIPhl+RDyqN4j+EUgbpIwcN74Qrry4GUh0z/THzQg+CO88rki+QAg+EqBAQD0DiCRMd7y0Gb4AAwANiD4SiPIyz9ZgQEA9EP4al8E0x8B8AH4R27yfAIBIBQOAgFYEg8BCbjomPxQEAHW+EFujhLtRNDT/9MA9AX4an/4Yfhm+GLe0XBtbwL4SoEBAPSGlQHXCz9/k3BwcOKRII4yXzPIIs8L/yHPCz8xMQFvIiGkA1mAIPRDbwI0IvhKgQEA9HyVAdcLP3+TcHBw4gI1MzHoXwMhwP8RAJiOLiPQ0wH6QDAxyM+HIM6NBAAAAAAAAAAAAAAAAA90TH4ozxYhbyICyx/0AMlx+wDeMMD/jhL4QsjL//hGzwsA+EoB9ADJ7VTef/hnAQm5Fqvn8BMAtvhBbo427UTQINdJwgGf0//TAPQF+Gp/+GH4Zvhijhv0BW34anABgED0DvK91wv/+GJw+GNw+GZ/+GHi3vhG8nNx+GbR+AD4QsjL//hGzwsA+EoB9ADJ7VR/+GcCASAYFQEJuxXvk1gWAbb4QW6OEu1E0NP/0wD0Bfhqf/hh+Gb4Yt76QNcNf5XU0dDTf9/XDACV1NHQ0gDf0VRxIMjPhYDKAHPPQM4B+gKAa89AyXP7APhKgQEA9IaVAdcLP3+TcHBw4pEgFwCEjigh+CO7myL4SoEBAPRbMPhq3iL4SoEBAPR8lQHXCz9/k3BwcOICNTMx6F8G+ELIy//4Rs8LAPhKAfQAye1Uf/hnAgEgGxkBCbjkYYdQGgC++EFujhLtRNDT/9MA9AX4an/4Yfhm+GLe1NH4RSBukjBw3vhCuvLgZfgA+ELIy//4Rs8LAPhKAfQAye1U+A8g+wQg0O0e7VPwAjD4QsjL//hGzwsA+EoB9ADJ7VR/+GcCAtoeHAEBSB0ALPhCyMv/+EbPCwD4SgH0AMntVPgP8gABAUgfAFhwItDWAjHSADDcIccA3CHXDR/yvFMR3cEEIoIQ/////byx8nwB8AH4R27yfA=="
class GiverV2:
@staticmethod
def compute_address(workchain: int = 0) -> _nt.Address:
return _nt.Address.from_parts(
workchain, _nt.Cell.decode(_giver_v2_tvc).repr_hash
)
def __init__(self, transport: _nt.Transport, keypair: _nt.KeyPair, workchain: int = 0):
self._transport = transport
self._address = GiverV2.compute_address(workchain)
self._keypair = keypair
async def send(self, target: _nt.Address, amount: _nt.Tokens, bounce: False):
signature_id = await self._transport.get_signature_id()
# Prepare external message
message = _giver_v2_send_grams.encode_external_message(
self._address,
input={
"dest": target,
"value": amount,
"bounce": bounce
},
public_key=self._keypair.public_key,
).sign(self._keypair, signature_id)
# Send external message
tx = await self._transport.send_external_message(message)
if tx is None:
raise RuntimeError("Message expired")
return tx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment