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
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
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
def fulfill(requestId, price): assert (ChainlinkClientCall( 'recordChainlinkFulfillment', [bytearray_reverse(GetCallingScriptHash()), requestId])) # Notify(['test']) Put(GetContext(), CURRENT_PRICE, price) return True
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
def setLockProxy(lockProxy): """ :param lockProxy: ont lock proxy :return: """ assert (CheckWitness(getOwner())) Put(GetContext(), LOCK_PROXY_KEY, bytearray_reverse(lockProxy)) return True
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
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
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
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
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
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
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
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
def aes_supply(): aesContractHash = "7f0ac00575b34c1f8a4fd4641f6c58721f668fd4" return DynamicAppCall(bytearray_reverse(aesContractHash), "balanceOf", [contract_address])
def setSinkSourceHash(sinkHash, sourceHash): Put(GetContext(), "SINK", bytearray_reverse(sinkHash)) Put(GetContext(), "SOURCE", bytearray_reverse(sourceHash)) Notify(["set", sinkHash, sourceHash]) return True
def address2hexstring(arg): from ontology.libont import bytes2hexstring, bytearray_reverse return bytes2hexstring(bytearray_reverse(arg), 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)
def onlyLINK(): assert (bytearray_reverse(GetCallingScriptHash()) == getChainLinkToken()) return True
def contractFallback(from_acct, to_acct, amount, data): assert (callBackFunction(bytearray_reverse(to_acct), "onTokenTransfer", from_acct, amount, data)) return True
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
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