Esempio n. 1
0
def createExchange(token_hash):
    # Ensure token is a contract with nonzero contract hash
    assert (token_hash != ZERO_ADDRESS and len(token_hash) == 20)

    # Ensure templateCode existgetExchange
    templateScript = Get(GetContext(), EXCHANGE_TEMPLATE_KEY)
    assert (len(templateScript) > 0)
    tokenCount = Get(GetContext(), TOKEN_COUNT_KEY)

    # # append unused byte code to avm code to produce different contract
    newTokenCount = tokenCount + 1
    templateScript = concat(templateScript, newTokenCount)

    # Deploy replica contract
    assert (Create(templateScript, True, "uniswap_exchange", "1.0", "uniswap_factory", "email", "uniswap_exchange contract created by uniswap_factory contract"))

    # Invoke the newly deployed contract to set up the token exchange pair
    exchangeHash = AddressFromVmCode(templateScript)
    exchangeAddr = bytearray_reverse(exchangeHash)
    tokenAddr = bytearray_reverse(token_hash)
    assert (DynamicAppCall(exchangeAddr, "setup", [tokenAddr, GetExecutingScriptHash()]))

    # Store the map between token and exchange contract hash
    Put(GetContext(), concat(TOKEN_TO_EXCHANGE_PREFIX, token_hash), exchangeAddr)
    Put(GetContext(), concat(EXCHANGE_TO_TOKEN_PREFIX, exchangeHash), tokenAddr)

    # Add the token count
    Put(GetContext(), TOKEN_COUNT_KEY, newTokenCount)

    # Map token with token id
    Put(GetContext(), concat(ID_TO_TOKEN_PREFIX, newTokenCount), tokenAddr)

    # Fire the event
    NewExchangeEvent(tokenAddr, exchangeAddr)
    return True
Esempio n. 2
0
def fulfill(requestId, price):
    chainlinkClient = Get(GetContext(), CHAINLINK_CLIENT)
    assert (DynamicCallFunction(
        bytearray_reverse(chainlinkClient), 'recordChainlinkFulfillment',
        [bytearray_reverse(GetCallingScriptHash()), requestId]))

    Put(GetContext(), CURRENT_PRICE, price)
    return True
Esempio n. 3
0
def requestEthereumPrice(oracle, jobId, payment):
    assert (CheckWitness(OWNER))
    chainlinkClient = Get(GetContext(), CHAINLINK_CLIENT)
    req = DynamicCallFunctionResult(bytearray_reverse(chainlinkClient),
                                    'buildChainlinkRequest',
                                    [jobId, ContractAddress, 'fulfill'])
    req = add(
        req, "get",
        "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD")
    req = add(req, "path", "USD")
    req = addInt(req, "times", 100)
    assert (DynamicCallFunction(bytearray_reverse(chainlinkClient),
                                'sendChainlinkRequestTo',
                                [OWNER, oracle, req, payment]))
    return True
Esempio n. 4
0
def fulfill(requestId, price):
    assert (ChainlinkClientCall(
        'recordChainlinkFulfillment',
        [bytearray_reverse(GetCallingScriptHash()), requestId]))
    # Notify(['test'])
    Put(GetContext(), CURRENT_PRICE, price)
    return True
Esempio n. 5
0
def cancelRequest(requestId, payment, callBackFunc, expiration):
    assert (CheckWitness(OWNER))
    chainlinkClient = Get(GetContext(), CHAINLINK_CLIENT)
    assert (DynamicCallFunction(
        bytearray_reverse(chainlinkClient), 'cancelChainlinkRequest',
        [OWNER, requestId, payment, callBackFunc, expiration]))
    return True
Esempio n. 6
0
def setLockProxy(lockProxy):
    """
    :param lockProxy: ont lock proxy
    :return:
    """
    assert (CheckWitness(getOwner()))
    Put(GetContext(), LOCK_PROXY_KEY, bytearray_reverse(lockProxy))
    return True
Esempio n. 7
0
def cancelChainlinkRequest(sender, requestId, payment, callbackFunctionId, expiration):
    RequireWitness(sender)
    oracle = Get(GetContext(), concatKey(PENDING_REQUESTS_PREFIX, requestId))
    params = [sender, requestId, payment, GetCallingScriptHash(), callbackFunctionId, expiration]
    assert (DynamicCallFunction(bytearray_reverse(oracle), "cancelOracleRequest", params))
    Delete(GetContext(), concatKey(PENDING_REQUESTS_PREFIX, requestId))
    ChainlinkCancelledEvent(requestId)
    return True
Esempio n. 8
0
def init(owner, feeCollector, lockProxy):
    """
    owner: address type
    feeCollector: address receiving fee
    lockProxy: lockProxy hash
    """
    assert (CheckWitness(owner))
    Put(GetContext(), OWNER_KEY, owner)
    Put(GetContext(), FEE_COLLECTOR_KEY, feeCollector)
    Put(GetContext(), LOCK_PROXY_KEY, bytearray_reverse(lockProxy))
    TransferOwnership("", owner)
    return True
Esempio n. 9
0
def Main(operation, args):
    print("appcall in")
    if elt_in(['add', 'sub', 'mul'], operation):
        print("StaticAppCall")
        return CalculatorContract(operation, args)
    elif operation[0:1] == 'd':
        address = bytearray_reverse(
            hexstring2bytes('1a6f62cc0ff3d9ae32b0b924aeda2056a9fdfccb'))
        print("DynamicAppCall")
        operation = operation[1:]
        print(operation)
        return DynamicAppCall(address, operation, args)
    elif operation == 'name':
        print("getname")
        return NAME
Esempio n. 10
0
def sendChainlinkRequestTo(caller, oracle, req, payment):
    RequireWitness(caller)
    requestCount = Get(GetContext(), REQUEST_COUNT)
    requestId = sha256(Serialize([req[1], caller, requestCount]))
    req[3] = requestCount
    Put(GetContext(), concatKey(PENDING_REQUESTS_PREFIX, requestId), oracle)
    ChainlinkRequestedEvent(requestId)
    link = Get(GetContext(), LINK_ADDRESS)

    params = [caller, oracle, payment,
              [SENDER_OVERRIDE, AMOUNT_OVERRIDE, req[0], req[1], req[2], req[3], ARGS_VERSION, req[4], 'oracleRequest']]
    assert (DynamicCallFunction(bytearray_reverse(link), "transferAndCall", params))

    Put(GetContext(), REQUEST_COUNT, requestCount + 1)
    return True
def cancelOracleRequest(sender, requestId, payment, callbackAddress,
                        callbackFunctionId, expiration):
    RequireWitness(sender)
    expiration = expiration + 0
    payment = payment + 0

    paramsHash = Serialize(
        [payment, callbackAddress, callbackFunctionId, expiration])

    originParamsHash = Get(GetContext(), concatKey(COMMITMENTS_PRIFX,
                                                   requestId))
    assert (paramsHash == originParamsHash)
    assert (expiration <= GetTime())
    Delete(GetContext(), concatKey(COMMITMENTS_PRIFX, requestId))

    assert (_transferLinkFromContact(bytearray_reverse(getChainLinkToken()),
                                     callbackAddress, payment))
    return True
Esempio n. 12
0
def upgrade(code, needStorage, name, version, author, email, description):
    """
    upgrade current smart contract to new smart contract.
    :param code:new smart contract avm code.
    :return: True or raise exception.
    """
    assert (CheckWitness(Get(GetContext(), OPERATOR_PREFIX)))
    newContractHash = AddressFromVmCode(code)
    newContractAddr = bytearray_reverse(newContractHash)
    ontBalance = _getSelfONTBalance()
    if ontBalance > 0:
        res = Invoke(0, ONT_ADDRESS, "transfer",
                     [state(CONTRACT_ADDRESS, newContractAddr, ontBalance)])
        assert (res)

    assert (_tryUnboundOng())
    ongBalance = _getSelfOngBalance()
    if ongBalance > 0:
        res = Invoke(0, ONG_ADDRESS, "transfer",
                     [state(CONTRACT_ADDRESS, newContractAddr, ongBalance)])
        assert (res)

    # transfer all the asset locked within lockproxy contract to the new contract
    fahListInfo = Get(GetContext(), FROM_ASSET_LIST_KEY)
    if len(fahListInfo) > 0:
        fahList = Deserialize(fahListInfo)
        for e in fahList:
            amount = getBalanceFor(e)
            if amount > 0:
                assert (_transferFromContract(e, newContractAddr,
                                              newContractAddr))

    # upgrade smart contract
    res = Migrate(code, needStorage, name, version, author, email, description)
    assert (res)

    Notify(["upgrade smart contract"])

    return True
def teamRelease():
    assert (CheckWitness(OWNER))
    now = GetTime()

    index = 0
    tryRelease = True
    while tryRelease == True and index < len(TEAMLOCK_END):
        if now > TEAMLOCK_END[index]:
            if not getReleaseHash(TEAMLOCK_END[index]):
                # Release token to team
                assert (_transfer(SELF_ADDRESS, TEAM_ADDRESS,
                                  TEAMCAP_AMOUNT[index] * FACTOR))
                txHash = bytearray_reverse(
                    GetTransactionHash(GetScriptContainer()))
                Put(GetContext(),
                    concat(UNLOCK_HASH_PERFIX, TEAMLOCK_END[index]), txHash)
                ReleaseEvent(txHash)
            index += 1
        else:
            tryRelease = False

    return True
Esempio n. 14
0
def withdraw(withdrawId):
    withdrawStatusInfo = Get(GetContext(),
                             concatKey(WITHDRAW_PREFIX, withdrawId))
    assert (withdrawStatusInfo)
    withdrawStatus = Deserialize(withdrawStatusInfo)
    currentHeight = GetHeight()
    confirmHeight = Get(GetContext(), CONFRIM_HEIGHT)
    assert (currentHeight - withdrawStatusInfo[3] >= confirmHeight)
    assetAddress = withdrawStatus[5]

    assert (withdrawStatus[4] == 0)
    if assetAddress == ONTAddress:
        assert (_transferONTFromContact(withdrawStatus[2], withdrawStatus[1]))
    elif assetAddress == ONGAddress:
        assert (_transferONGFromContact(withdrawStatus[2], withdrawStatus[1]))
    else:
        reverseAssetAddress = bytearray_reverse(assetAddress)
        assert (_transferOEP4FromContact(reverseAssetAddress,
                                         withdrawStatus[2], withdrawStatus[1]))

    WithdrawEvent(withdrawStatus[0], withdrawStatus[1], withdrawStatus[2],
                  withdrawStatus[3], 1, withdrawStatus[5])
    return True
Esempio n. 15
0
def Main(operation, args):
    global z0
    z0 = 999
    b0[a0[4]][0] = 30
    b0[a0[0]][a0[4]][1] = 20

    x = 'local'
    assert (b[1] == 7)
    assert (b[2] == 7)
    assert (b[3] == 7)
    assert (b[4] == 7)
    b[1] = 90
    global a
    a[0][0] = '00'
    assert (x == 'local')

    checkglobal()
    assert (b[1] == 'checkglobal')
    assert (a == 9)
    print(a)
    print(b[1])
    assert (b0 == 8888)
    assert (y0[2] == 88)

    if elt_in(['add', 'sub', 'mul'], operation):
        print("StaticAppCall")
        return CalculatorContract(operation, args)
    elif operation[0:1] == 'd':
        address = bytearray_reverse(
            hexstring2bytes('91125f47bd4823324de4897b64e0c2b3b503dfed'))
        print("DynamicAppCall")
        operation = operation[1:]
        print(operation)
        return DynamicAppCall(address, operation, args)
    elif operation == 'name':
        print("getname")
        return NAME
Esempio n. 16
0
def deposit(player, amount, assetAddress):
    assert (CheckWitness(player))

    currentId = Get(GetContext(), CURRENT_DEPOSIT_ID)
    if not currentId:
        currentId = 1
    height = Get(GetContext(), CURRENT_HEIGHT)

    if assetAddress == ONTAddress:
        assert (_transferONT(player, ContractAddress, amount))
    elif assetAddress == ONGAddress:
        assert (_transferONG(player, ContractAddress, amount))
    else:
        reverseAssetAddress = bytearray_reverse(assetAddress)
        assert (_transferOEP4(reverseAssetAddress, player, ContractAddress,
                              amount))

    depositRecord = [player, amount, height, 0]
    depositRecordInfo = Serialize(depositRecord)

    Put(GetContext(), CURRENT_DEPOSIT_ID, currentId + 1)
    Put(GetContext(), concatKey(DEPOSIT_PREFIX, currentId), depositRecordInfo)
    DepositEvent(currentId, player, amount, height, 0, assetAddress)
    return True
Esempio n. 17
0
def aes_supply():
    aesContractHash = "7f0ac00575b34c1f8a4fd4641f6c58721f668fd4"
    return DynamicAppCall(bytearray_reverse(aesContractHash), "balanceOf",
                          [contract_address])
Esempio n. 18
0
def setSinkSourceHash(sinkHash, sourceHash):
    Put(GetContext(), "SINK", bytearray_reverse(sinkHash))
    Put(GetContext(), "SOURCE", bytearray_reverse(sourceHash))
    Notify(["set", sinkHash, sourceHash])
    return True
Esempio n. 19
0
def address2hexstring(arg):
    from ontology.libont import bytes2hexstring, bytearray_reverse
    return bytes2hexstring(bytearray_reverse(arg), 0)
Esempio n. 20
0
def hexstring2address(arg):
    from ontology.libont import hexstring2bytes, bytearray_reverse
    return bytearray_reverse(hexstring2bytes(arg))
def Main():
    a = "145c69fdc3c648f0846e8c366e6578564f047f1c"
    b = hexstring2bytes(a)
    VaasAssert(
        b ==
        b'\x14\x5c\x69\xfd\xc3\xc6\x48\xf0\x84\x6e\x8c\x36\x6e\x65\x78\x56\x4f\x04\x7f\x1c\xFF'
    )

    c = bytearray_reverse(b)
    VaasAssert(len(c) == 20)
    VaasAssert(
        c ==
        b'\x1c\x7f\x04\x4f\x56\x78\x65\x6e\x36\x8c\x6e\x84\xf0\x48\xc6\xc3\xfd\x69\x5c\x14'
    )

    a = 'aCe4702454c48f3EA430f6d52815318669B3818c'
    b = hexstring2bytes(a)
    VaasAssert(
        b ==
        b'\xac\xe4\x70\x24\x54\xc4\x8f\x3e\xa4\x30\xf6\xd5\x28\x15\x31\x86\x69\xb3\x81\x8c'
    )

    c = bytearray_reverse(b)
    VaasAssert(len(c) == 20)
    VaasAssert(
        c ==
        b'\x8c\x81\xb3\x69\x86\x31\x15\x28\xd5\xf6\x30\xa4\x3e\x8f\xc4\x54\x24\x70\xe4\xac'
    )

    a = '2d1c6ed6e2cF9f1857ea0294eAad57098961432f'
    b = hexstring2bytes(a)
    VaasAssert(
        b ==
        b'\x2d\x1c\x6e\xd6\xe2\xcf\x9f\x18\x57\xea\x02\x94\xea\xad\x57\x09\x89\x61\x43\x2f'
    )

    c = bytearray_reverse(b)
    VaasAssert(
        c ==
        b'\x2f\x43\x61\x89\x09\x57\xad\xea\x94\x02\xea\x57\x18\x9f\xcf\xe2\xd6\x6e\x1c\x2d'
    )

    a = 'a5813809fe3a573d43d83B1cb1ab88a9f69e2a07'
    b = hexstring2bytes(a)
    VaasAssert(
        b ==
        b'\xa5\x81\x38\x09\xfe\x3a\x57\x3d\x43\xd8\x3b\x1c\xb1\xab\x88\xa9\xf6\x9e\x2a\x07'
    )

    a = '3459e97812aDc6457a502a20ec1aa01deeef9724'
    b = hexstring2bytes(a)
    VaasAssert(
        b ==
        b'\x34\x59\xe9\x78\x12\xad\xc6\x45\x7a\x50\x2a\x20\xec\x1a\xa0\x1d\xee\xef\x97\x24'
    )

    a = 'ecb6502e1d7fec4b3d5cd9a0440a67b45061f847'
    b = hexstring2bytes(a)
    VaasAssert(
        b ==
        b'\xec\xb6\x50\x2e\x1d\x7f\xec\x4b\x3d\x5c\xd9\xa0\x44\x0a\x67\xb4\x50\x61\xf8\x47'
    )

    a = 'c3a9b151901993d8649af8e176f8064b63f67f34'
    b = hexstring2bytes(a)
    VaasAssert(
        b ==
        b'\xc3\xa9\xb1\x51\x90\x19\x93\xd8\x64\x9a\xf8\xe1\x76\xf8\x06\x4b\x63\xf6\x7f\x34'
    )

    a = '60c56b6a00527ac46a51527ac409746573746e616d65306a52527ac46a00c30f4d696772617465436f6e74726163749c6440006a51c3c0519e642b000b706172616d206572726f72681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a51c300c365cf006c7566616a00c3037075749c6409006530006c7566616a00c3036765749c6409006567006c7566616a00c3046e616d659c6409006a52c36c756661006c756655c56b034b45596a00527ac4681953797374656d2e53746f726167652e476574436f6e74657874616a00c30281035272681253797374656d2e53746f726167652e50757461516c756654c56b034b45596a00527ac4681953797374656d2e53746f726167652e476574436f6e74657874616a00c37c681253797374656d2e53746f726167652e476574616c756656c56b6a00527ac46a00c351046e616d650776657273696f6e06617574686f7205656d61696c0b6465736372697074696f6e56795179587275517275557952795772755272755479537956727553727568194f6e746f6c6f67792e436f6e74726163742e4d69677261746561144d696772617465207375636365737366756c6c7951c176c9681553797374656d2e52756e74696d652e4e6f7469667961516c7566'
    b = hexstring2bytes(a)
    VaasAssert(
        b ==
        b'\x60\xc5\x6b\x6a\x00\x52\x7a\xc4\x6a\x51\x52\x7a\xc4\x09\x74\x65\x73\x74\x6e\x61\x6d\x65\x30\x6a\x52\x52\x7a\xc4\x6a\x00\xc3\x0f\x4d\x69\x67\x72\x61\x74\x65\x43\x6f\x6e\x74\x72\x61\x63\x74\x9c\x64\x40\x00\x6a\x51\xc3\xc0\x51\x9e\x64\x2b\x00\x0b\x70\x61\x72\x61\x6d\x20\x65\x72\x72\x6f\x72\x68\x15\x53\x79\x73\x74\x65\x6d\x2e\x52\x75\x6e\x74\x69\x6d\x65\x2e\x4e\x6f\x74\x69\x66\x79\x61\x00\x6c\x75\x66\x61\x6a\x51\xc3\x00\xc3\x65\xcf\x00\x6c\x75\x66\x61\x6a\x00\xc3\x03\x70\x75\x74\x9c\x64\x09\x00\x65\x30\x00\x6c\x75\x66\x61\x6a\x00\xc3\x03\x67\x65\x74\x9c\x64\x09\x00\x65\x67\x00\x6c\x75\x66\x61\x6a\x00\xc3\x04\x6e\x61\x6d\x65\x9c\x64\x09\x00\x6a\x52\xc3\x6c\x75\x66\x61\x00\x6c\x75\x66\x55\xc5\x6b\x03\x4b\x45\x59\x6a\x00\x52\x7a\xc4\x68\x19\x53\x79\x73\x74\x65\x6d\x2e\x53\x74\x6f\x72\x61\x67\x65\x2e\x47\x65\x74\x43\x6f\x6e\x74\x65\x78\x74\x61\x6a\x00\xc3\x02\x81\x03\x52\x72\x68\x12\x53\x79\x73\x74\x65\x6d\x2e\x53\x74\x6f\x72\x61\x67\x65\x2e\x50\x75\x74\x61\x51\x6c\x75\x66\x54\xc5\x6b\x03\x4b\x45\x59\x6a\x00\x52\x7a\xc4\x68\x19\x53\x79\x73\x74\x65\x6d\x2e\x53\x74\x6f\x72\x61\x67\x65\x2e\x47\x65\x74\x43\x6f\x6e\x74\x65\x78\x74\x61\x6a\x00\xc3\x7c\x68\x12\x53\x79\x73\x74\x65\x6d\x2e\x53\x74\x6f\x72\x61\x67\x65\x2e\x47\x65\x74\x61\x6c\x75\x66\x56\xc5\x6b\x6a\x00\x52\x7a\xc4\x6a\x00\xc3\x51\x04\x6e\x61\x6d\x65\x07\x76\x65\x72\x73\x69\x6f\x6e\x06\x61\x75\x74\x68\x6f\x72\x05\x65\x6d\x61\x69\x6c\x0b\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x56\x79\x51\x79\x58\x72\x75\x51\x72\x75\x55\x79\x52\x79\x57\x72\x75\x52\x72\x75\x54\x79\x53\x79\x56\x72\x75\x53\x72\x75\x68\x19\x4f\x6e\x74\x6f\x6c\x6f\x67\x79\x2e\x43\x6f\x6e\x74\x72\x61\x63\x74\x2e\x4d\x69\x67\x72\x61\x74\x65\x61\x14\x4d\x69\x67\x72\x61\x74\x65\x20\x73\x75\x63\x63\x65\x73\x73\x66\x75\x6c\x6c\x79\x51\xc1\x76\xc9\x68\x15\x53\x79\x73\x74\x65\x6d\x2e\x52\x75\x6e\x74\x69\x6d\x65\x2e\x4e\x6f\x74\x69\x66\x79\x61\x51\x6c\x75\x66'
    )

    a = '00000000007fec4b3d5cd9a0440a670000000000'
    b = hexstring2bytes(a)
    print(b)
    VaasAssert(
        b ==
        b'\x00\x00\x00\x00\x00\x7f\xec\x4b\x3d\x5c\xd9\xa0\x44\x0a\x67\x00\x00\x00\x00\x00'
    )
    VaasAssert(len(b) == 20)
Esempio n. 22
0
def onlyLINK():
    assert (bytearray_reverse(GetCallingScriptHash()) == getChainLinkToken())
    return True
Esempio n. 23
0
def contractFallback(from_acct, to_acct, amount, data):
    assert (callBackFunction(bytearray_reverse(to_acct), "onTokenTransfer",
                             from_acct, amount, data))
    return True
Esempio n. 24
0
def transferAndCall(from_acct, to_acct, amount, data):
    assert (transfer(from_acct, bytearray_reverse(to_acct), amount))
    TransferAndCallEvent(from_acct, to_acct, amount, data)
    assert (contractFallback(from_acct, to_acct, amount, data))
    return True
Esempio n. 25
0
def TokenTransferFrom(exchangeId, order):
    """

    :param exchangeId:exchange id, Invoked only by registered exchange
    :param order: the order is a map structure.
    :return:True or false, if success, the maker and taker will get purpose token.
    """
    expireTime = order['expireTime']
    require(GetTime() <= expireTime, "order expired")
    require(CheckWitness(exchangeId), "invalid exchange")

    if not Get(ctx, concatKey(EXCHANGE_ID_PREFIX, exchangeId)):
        return False

    maker = order['makerAddress']
    makerAmount = order['makerAssetAmount']
    makerHash = order['makerTokenHash']
    taker = order['takerAddress']
    takerAmount = order['takerAssetAmount']
    takerHash = order['takerTokenHash']
    makerFee = order['makerFee']
    takerFee = order['takerFee']
    feeTokenHash = order['feeTokenHash']
    feeFeceiver = order['feeReceiver']

    if isNativeAsset(makerHash):
        require(
            transferFromNative(makerHash, ContractAddress, maker, taker,
                               makerAmount),
            "transfer from maker asset failed")
    else:
        require(
            DynamicAppCall(bytearray_reverse(makerHash), "transferFrom",
                           [ContractAddress, maker, taker, makerAmount]),
            "transfer maker token to taker failed")

    Notify("111")

    if isNativeAsset(takerHash):
        require(
            transferFromNative(takerHash, ContractAddress, taker, maker,
                               takerAmount),
            "transfer from taker asset failed")
    else:
        require(
            DynamicAppCall(bytearray_reverse(takerHash), "transferFrom",
                           [ContractAddress, taker, maker, takerAmount]),
            "transfer taker token to maker failed")

    Notify("222")

    if isNativeAsset(feeTokenHash):
        require(
            transferFromNative(feeTokenHash, ContractAddress, maker,
                               feeFeceiver, makerFee),
            "charge maker fee failed")
        require(
            transferFromNative(feeTokenHash, ContractAddress, taker,
                               feeFeceiver, takerFee),
            "charge taker fee failed")
    else:
        require(
            DynamicAppCall(bytearray_reverse(feeTokenHash), "transferFrom",
                           [ContractAddress, maker, feeFeceiver, makerFee]),
            "charge maker fee failed")
        require(
            DynamicAppCall(bytearray_reverse(feeTokenHash), "transferFrom",
                           [ContractAddress, taker, feeFeceiver, takerFee]),
            "charge taker fee failed")

    Notify("success")

    return True