Escrow tutorial: complete websocket examples

This commit is contained in:
mDuo13
2017-08-28 10:52:44 -07:00
parent 2ebffb53be
commit 5005350354
26 changed files with 1071 additions and 491 deletions

View File

@@ -1,7 +0,0 @@
{
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"TransactionType": "EscrowCreate",
"Amount": "10000",
"Destination": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
"Condition": "a02580202ed6c7f59fdda3a01d0d3288dbbb1335ef22e574269ff8ca17ef0d0b5a3902ca810120"
}

View File

@@ -1,7 +0,0 @@
{
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"TransactionType": "EscrowCreate",
"Amount": "10000",
"Destination": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
"FinishAfter": 563846400
}

View File

@@ -1,8 +0,0 @@
{
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"TransactionType": "EscrowFinish",
"Owner": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"OfferSequence": 374,
"Condition": "a02580202ed6c7f59fdda3a01d0d3288dbbb1335ef22e574269ff8ca17ef0d0b5a3902ca810120",
"Fulfillment": "a022802044eecc291bc46371e3a8db93be8b76818115e903de2a6a0b14cfe033235cd397"
}

View File

@@ -0,0 +1,7 @@
{
"id": 5,
"command": "account_objects",
"account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"ledger_index": "validated",
"type": "escrow"
}

View File

@@ -0,0 +1,26 @@
{
"id": 5,
"status": "success",
"type": "response",
"result": {
"account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"account_objects": [
{
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Amount": "100000",
"CancelAfter": 556927412,
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Flags": 0,
"LedgerEntryType": "Escrow",
"OwnerNode": "0000000000000000",
"PreviousTxnID": "E22D1F6EB006CAD35E0DBD3B4F3748427055E4C143EBE95AA6603823AEEAD324",
"PreviousTxnLgrSeq": 1772019,
"index": "E2CF730A31FD419382350C9DBD8DB7CD775BA5AA9B97A9BE9AB07304AA217A75"
}
],
"ledger_hash": "F2ABEA175F4AB871845B01CB51E4324DBA2C2553EC34448D4AB1EB0A3F2D8EFB",
"ledger_index": 1772020,
"validated": true
}
}

View File

@@ -0,0 +1,5 @@
{
"id": 4,
"command": "ledger",
"ledger_index": "validated"
}

View File

@@ -0,0 +1,28 @@
{
"id": 4,
"status": "success",
"type": "response",
"result": {
"ledger": {
"accepted": true,
"account_hash": "3B5A8FF5334F94F4D3D09F236F9D1B4C028FCAE30948ACC986D461DDEE1D886B",
"close_flags": 0,
"close_time": 557256670,
"close_time_human": "2017-Aug-28 17:31:10",
"close_time_resolution": 10,
"closed": true,
"hash": "A999223A80174A7CB39D766B625C9E476F24AD2F15860A712CD029EE5ED1C320",
"ledger_hash": "A999223A80174A7CB39D766B625C9E476F24AD2F15860A712CD029EE5ED1C320",
"ledger_index": "1908253",
"parent_close_time": 557256663,
"parent_hash": "6A70C5336ACFDA05760D827776079F7A544D2361CFD5B21BD55A92AA20477A61",
"seqNum": "1908253",
"totalCoins": "99997280690562728",
"total_coins": "99997280690562728",
"transaction_hash": "49A51DFB1CAB2F134D93D5D1C5FF55A15B12DA36DAF9F5862B17C47EE966647D"
},
"ledger_hash": "A999223A80174A7CB39D766B625C9E476F24AD2F15860A712CD029EE5ED1C320",
"ledger_index": 1908253,
"validated": true
}
}

View File

@@ -0,0 +1,12 @@
{
"command": "submit",
"secret": "s████████████████████████████",
"tx_json": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"TransactionType": "EscrowCreate",
"Amount": "100000",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"CancelAfter": 556927412
}
}

View File

@@ -0,0 +1,11 @@
{
"command": "submit",
"secret": "s████████████████████████████",
"tx_json": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"TransactionType": "EscrowCreate",
"Amount": "10000",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"FinishAfter": 557020800
}
}

View File

@@ -0,0 +1,13 @@
{
"command": "submit",
"secret": "s████████████████████████████",
"tx_json": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"TransactionType": "EscrowFinish",
"Owner": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"OfferSequence": 5,
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Fulfillment": "A0228020D280D1A02BAD0D2EBC0528B92E9BF37AC3E2530832C2C52620307135156F1048",
"Fee": "500"
}
}

View File

@@ -0,0 +1,10 @@
{
"command": "submit",
"secret": "s████████████████████████████",
"tx_json": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"TransactionType": "EscrowFinish",
"Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"OfferSequence": 1
}
}

View File

@@ -0,0 +1,25 @@
{
"id": 1,
"status": "success",
"type": "response",
"result": {
"engine_result": "tesSUCCESS",
"engine_result_code": 0,
"engine_result_message": "The transaction was applied. Only final in a validated ledger.",
"tx_blob": "120001228000000024000000052024213209B46140000000000186A068400000000000000A732103E498E35BC1E109C5995BD3AB0A6D4FFAB61B853C8F6010FABC5DABAF34478B61744730450221008AC8BDC2151D5EF956197F0E6E89A4F49DEADC1AC38367870E444B1EA8D88D97022075E31427B455DFF87F0F22B849C71FC3987A91C19D63B6D0242E808347EC8A8F701127A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD81012081149A2AA667E1517EFA8A6B552AB2EDB859A99F26B283144B4E9C06F24296074F7BC48F92A97916C6DC5EA9",
"tx_json": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Amount": "100000",
"CancelAfter": 556927412,
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Fee": "10",
"Flags": 2147483648,
"Sequence": 5,
"SigningPubKey": "03E498E35BC1E109C5995BD3AB0A6D4FFAB61B853C8F6010FABC5DABAF34478B61",
"TransactionType": "EscrowCreate",
"TxnSignature": "30450221008AC8BDC2151D5EF956197F0E6E89A4F49DEADC1AC38367870E444B1EA8D88D97022075E31427B455DFF87F0F22B849C71FC3987A91C19D63B6D0242E808347EC8A8F",
"hash": "E22D1F6EB006CAD35E0DBD3B4F3748427055E4C143EBE95AA6603823AEEAD324"
}
}
}

View File

@@ -0,0 +1,24 @@
{
"id": 2,
"status": "success",
"type": "response",
"result": {
"engine_result": "tesSUCCESS",
"engine_result_code": 0,
"engine_result_message": "The transaction was applied. Only final in a validated ledger.",
"tx_blob": "1200012280000000240000000120252133768061400000000000271068400000000000000A732103C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E437446304402203C9AA4C21E1A1A7427D41583283E7A513DDBDD967B246CADD3B2705D858A7A8E02201BEA7B923B18910EEB9F306F6DE3B3F53549BBFAD46335B62B4C34A6DCB4A47681143EEB46C355B04EE8D08E8EED00F422895C79EA6A83144B4E9C06F24296074F7BC48F92A97916C6DC5EA9",
"tx_json": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Amount": "10000",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Fee": "10",
"FinishAfter": 557020800,
"Flags": 2147483648,
"Sequence": 1,
"SigningPubKey": "03C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E43",
"TransactionType": "EscrowCreate",
"TxnSignature": "304402203C9AA4C21E1A1A7427D41583283E7A513DDBDD967B246CADD3B2705D858A7A8E02201BEA7B923B18910EEB9F306F6DE3B3F53549BBFAD46335B62B4C34A6DCB4A476",
"hash": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263"
}
}
}

View File

@@ -0,0 +1,25 @@
{
"id": 4,
"status": "success",
"type": "response",
"result": {
"engine_result": "tesSUCCESS",
"engine_result_code": 0,
"engine_result_message": "The transaction was applied. Only final in a validated ledger.",
"tx_blob": "120002228000000024000000062019000000056840000000000001F4732103E498E35BC1E109C5995BD3AB0A6D4FFAB61B853C8F6010FABC5DABAF34478B617446304402207DE4EA9C8655E75BA01F96345B3F62074313EB42C15D9C4871E30F02202D2BA50220070E52AD308A31AC71E33BA342F31B68D1D1B2A7A3A3ED6E8552CA3DCF14FBB2701024A0228020D280D1A02BAD0D2EBC0528B92E9BF37AC3E2530832C2C52620307135156F1048701127A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD81012081149A2AA667E1517EFA8A6B552AB2EDB859A99F26B282149A2AA667E1517EFA8A6B552AB2EDB859A99F26B2",
"tx_json": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Fee": "500",
"Flags": 2147483648,
"Fulfillment": "A0228020D280D1A02BAD0D2EBC0528B92E9BF37AC3E2530832C2C52620307135156F1048",
"OfferSequence": 5,
"Owner": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Sequence": 6,
"SigningPubKey": "03E498E35BC1E109C5995BD3AB0A6D4FFAB61B853C8F6010FABC5DABAF34478B61",
"TransactionType": "EscrowFinish",
"TxnSignature": "304402207DE4EA9C8655E75BA01F96345B3F62074313EB42C15D9C4871E30F02202D2BA50220070E52AD308A31AC71E33BA342F31B68D1D1B2A7A3A3ED6E8552CA3DCF14FBB2",
"hash": "0E88368CAFC69A722ED829FAE6E2DD3575AE9C192691E60B5ACDF706E219B2BF"
}
}
}

View File

@@ -0,0 +1,23 @@
{
"id": 1,
"status": "success",
"type": "response",
"result": {
"engine_result": "tesSUCCESS",
"engine_result_code": 0,
"engine_result_message": "The transaction was applied. Only final in a validated ledger.",
"tx_blob": "1200022280000000240000000220190000000168400000000000000A732103C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E4374473045022100923B91BA4FD6450813F5335D71C64BA9EB81304A86859A631F2AD8571424A46502200CCE660D36781B84634C5F23619EB6CFCCF942709F54DCCF27CF6F499AE78C9B81143EEB46C355B04EE8D08E8EED00F422895C79EA6A82143EEB46C355B04EE8D08E8EED00F422895C79EA6A",
"tx_json": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Fee": "10",
"Flags": 2147483648,
"OfferSequence": 1,
"Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Sequence": 2,
"SigningPubKey": "03C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E43",
"TransactionType": "EscrowFinish",
"TxnSignature": "3045022100923B91BA4FD6450813F5335D71C64BA9EB81304A86859A631F2AD8571424A46502200CCE660D36781B84634C5F23619EB6CFCCF942709F54DCCF27CF6F499AE78C9B",
"hash": "41856A742B3CAF307E7B4D0B850F302101F0F415B785454F7501E9960A2A1F6B"
}
}
}

View File

@@ -0,0 +1,4 @@
{
"command": "tx",
"transaction": "E22D1F6EB006CAD35E0DBD3B4F3748427055E4C143EBE95AA6603823AEEAD324"
}

View File

@@ -0,0 +1,5 @@
{
"id": 3,
"command": "tx",
"transaction": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263"
}

View File

@@ -0,0 +1,5 @@
{
"id": 20,
"command": "tx",
"transaction": "52C4F626FE6F33699B6BE8ADF362836DDCE9B0B1294BFAA15D65D61501350BE6"
}

View File

@@ -0,0 +1,5 @@
{
"id": 21,
"command": "tx",
"transaction": "41856A742B3CAF307E7B4D0B850F302101F0F415B785454F7501E9960A2A1F6B"
}

View File

@@ -0,0 +1,81 @@
{
"id": 3,
"status": "success",
"type": "response",
"result": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Amount": "100000",
"CancelAfter": 556927412,
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Fee": "10",
"Flags": 2147483648,
"Sequence": 5,
"SigningPubKey": "03E498E35BC1E109C5995BD3AB0A6D4FFAB61B853C8F6010FABC5DABAF34478B61",
"TransactionType": "EscrowCreate",
"TxnSignature": "30450221008AC8BDC2151D5EF956197F0E6E89A4F49DEADC1AC38367870E444B1EA8D88D97022075E31427B455DFF87F0F22B849C71FC3987A91C19D63B6D0242E808347EC8A8F",
"date": 556841101,
"hash": "E22D1F6EB006CAD35E0DBD3B4F3748427055E4C143EBE95AA6603823AEEAD324",
"inLedger": 1772019,
"ledger_index": 1772019,
"meta": {
"AffectedNodes": [
{
"ModifiedNode": {
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8",
"PreviousTxnID": "52C4F626FE6F33699B6BE8ADF362836DDCE9B0B1294BFAA15D65D61501350BE6",
"PreviousTxnLgrSeq": 1771204
}
},
{
"ModifiedNode": {
"FinalFields": {
"Flags": 0,
"Owner": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"RootIndex": "4B4EBB6D8563075813D47491CC325865DFD3DC2E94889F0F39D59D9C059DD81F"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "4B4EBB6D8563075813D47491CC325865DFD3DC2E94889F0F39D59D9C059DD81F"
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Balance": "9999798970",
"Flags": 0,
"OwnerCount": 1,
"Sequence": 6
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "5F3B7107F4B524367A173A2B0EAB66E8CC4D2178C1B0C0528CB2F73A8B6BF254",
"PreviousFields": {
"Balance": "9999898980",
"OwnerCount": 0,
"Sequence": 5
},
"PreviousTxnID": "52C4F626FE6F33699B6BE8ADF362836DDCE9B0B1294BFAA15D65D61501350BE6",
"PreviousTxnLgrSeq": 1771204
}
},
{
"CreatedNode": {
"LedgerEntryType": "Escrow",
"LedgerIndex": "E2CF730A31FD419382350C9DBD8DB7CD775BA5AA9B97A9BE9AB07304AA217A75",
"NewFields": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Amount": "100000",
"CancelAfter": 556927412,
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn"
}
}
}
],
"TransactionIndex": 0,
"TransactionResult": "tesSUCCESS"
},
"validated": true
}
}

View File

@@ -0,0 +1,78 @@
{
"id": 3,
"status": "success",
"type": "response",
"result": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Amount": "10000",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Fee": "10",
"FinishAfter": 557020800,
"Flags": 2147483648,
"Sequence": 1,
"SigningPubKey": "03C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E43",
"TransactionType": "EscrowCreate",
"TxnSignature": "304402203C9AA4C21E1A1A7427D41583283E7A513DDBDD967B246CADD3B2705D858A7A8E02201BEA7B923B18910EEB9F306F6DE3B3F53549BBFAD46335B62B4C34A6DCB4A476",
"date": 557014081,
"hash": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263",
"inLedger": 1828796,
"ledger_index": 1828796,
"meta": {
"AffectedNodes": [
{
"ModifiedNode": {
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8",
"PreviousTxnID": "613B28E0890FC975F2CBA3D700F75116F623B1E3FE48CB7CB2EB216EAD6F097D",
"PreviousTxnLgrSeq": 1799920
}
},
{
"CreatedNode": {
"LedgerEntryType": "Escrow",
"LedgerIndex": "2B9845CB9DF686B9615BF04F3EC66095A334D985E03E71B893B90FCF6D4DC9E6",
"NewFields": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Amount": "10000",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"FinishAfter": 557020800
}
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Balance": "9999989990",
"Flags": 0,
"OwnerCount": 1,
"Sequence": 2
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "AE5AB6584A76C37C7382B6880609FC7792D90CDA36FF362AF412EB914C1715D3",
"PreviousFields": {
"Balance": "10000000000",
"OwnerCount": 0,
"Sequence": 1
},
"PreviousTxnID": "F181D45FD094A7417926F791D9DF958B84CE4B7B3D92CC9DDCACB1D5EC59AAAA",
"PreviousTxnLgrSeq": 1828732
}
},
{
"CreatedNode": {
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "D623EBEEEE701D4323D0ADA5320AF35EA8CC6520EBBEF69343354CD593DABC88",
"NewFields": {
"Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"RootIndex": "D623EBEEEE701D4323D0ADA5320AF35EA8CC6520EBBEF69343354CD593DABC88"
}
}
}
],
"TransactionIndex": 3,
"TransactionResult": "tesSUCCESS"
},
"validated": true
}
}

View File

@@ -0,0 +1,95 @@
{
"id": 20,
"status": "success",
"type": "response",
"result": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Fee": "500",
"Flags": 2147483648,
"Fulfillment": "A0228020D280D1A02BAD0D2EBC0528B92E9BF37AC3E2530832C2C52620307135156F1048",
"OfferSequence": 2,
"Owner": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Sequence": 4,
"SigningPubKey": "03E498E35BC1E109C5995BD3AB0A6D4FFAB61B853C8F6010FABC5DABAF34478B61",
"TransactionType": "EscrowFinish",
"TxnSignature": "3045022100925FEBE21C2E57F81C472A4E5869CAB1D0164C472A46532F39F6F9F7ED6846D002202CF9D9063ADC4CC0ADF4C4692B7EE165C5D124CAA855649389E245D993F41D4D",
"date": 556838610,
"hash": "52C4F626FE6F33699B6BE8ADF362836DDCE9B0B1294BFAA15D65D61501350BE6",
"inLedger": 1771204,
"ledger_index": 1771204,
"meta": {
"AffectedNodes": [
{
"ModifiedNode": {
"FinalFields": {
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Balance": "400100000",
"Flags": 0,
"OwnerCount": 0,
"Sequence": 1
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8",
"PreviousFields": {
"Balance": "400000000"
},
"PreviousTxnID": "795CBC8AFAAB9DC7BD9944C7FAEABF9BB0802A84520BC649213AD6A2C3256C95",
"PreviousTxnLgrSeq": 1770775
}
},
{
"ModifiedNode": {
"FinalFields": {
"Flags": 0,
"Owner": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"RootIndex": "4B4EBB6D8563075813D47491CC325865DFD3DC2E94889F0F39D59D9C059DD81F"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "4B4EBB6D8563075813D47491CC325865DFD3DC2E94889F0F39D59D9C059DD81F"
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Balance": "9999898980",
"Flags": 0,
"OwnerCount": 0,
"Sequence": 5
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "5F3B7107F4B524367A173A2B0EAB66E8CC4D2178C1B0C0528CB2F73A8B6BF254",
"PreviousFields": {
"Balance": "9999899480",
"OwnerCount": 1,
"Sequence": 4
},
"PreviousTxnID": "5C2A1E7B209A7404D3722A010D331A8C1C853109A47DDF620DE5E3D59F026581",
"PreviousTxnLgrSeq": 1771042
}
},
{
"DeletedNode": {
"FinalFields": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Amount": "100000",
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"FinishAfter": 556838185,
"Flags": 0,
"OwnerNode": "0000000000000000",
"PreviousTxnID": "795CBC8AFAAB9DC7BD9944C7FAEABF9BB0802A84520BC649213AD6A2C3256C95",
"PreviousTxnLgrSeq": 1770775
},
"LedgerEntryType": "Escrow",
"LedgerIndex": "DC524D17B3F650E7A215B332F418E54AE59B0DFC5392E74958B0037AFDFE8C8D"
}
}
],
"TransactionIndex": 1,
"TransactionResult": "tesSUCCESS"
},
"validated": true
}
}

View File

@@ -0,0 +1,92 @@
{
"id": 2,
"status": "success",
"type": "response",
"result": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Fee": "10",
"Flags": 2147483648,
"OfferSequence": 1,
"Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Sequence": 2,
"SigningPubKey": "03C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E43",
"TransactionType": "EscrowFinish",
"TxnSignature": "3045022100923B91BA4FD6450813F5335D71C64BA9EB81304A86859A631F2AD8571424A46502200CCE660D36781B84634C5F23619EB6CFCCF942709F54DCCF27CF6F499AE78C9B",
"date": 557256681,
"hash": "41856A742B3CAF307E7B4D0B850F302101F0F415B785454F7501E9960A2A1F6B",
"inLedger": 1908257,
"ledger_index": 1908257,
"meta": {
"AffectedNodes": [
{
"ModifiedNode": {
"FinalFields": {
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Balance": "400210000",
"Flags": 0,
"OwnerCount": 0,
"Sequence": 1
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8",
"PreviousFields": {
"Balance": "400200000"
},
"PreviousTxnID": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263",
"PreviousTxnLgrSeq": 1828796
}
},
{
"DeletedNode": {
"FinalFields": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Amount": "10000",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"FinishAfter": 557020800,
"Flags": 0,
"OwnerNode": "0000000000000000",
"PreviousTxnID": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263",
"PreviousTxnLgrSeq": 1828796
},
"LedgerEntryType": "Escrow",
"LedgerIndex": "2B9845CB9DF686B9615BF04F3EC66095A334D985E03E71B893B90FCF6D4DC9E6"
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Balance": "9999989980",
"Flags": 0,
"OwnerCount": 0,
"Sequence": 3
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "AE5AB6584A76C37C7382B6880609FC7792D90CDA36FF362AF412EB914C1715D3",
"PreviousFields": {
"Balance": "9999989990",
"OwnerCount": 1,
"Sequence": 2
},
"PreviousTxnID": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263",
"PreviousTxnLgrSeq": 1828796
}
},
{
"ModifiedNode": {
"FinalFields": {
"Flags": 0,
"Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"RootIndex": "D623EBEEEE701D4323D0ADA5320AF35EA8CC6520EBBEF69343354CD593DABC88"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "D623EBEEEE701D4323D0ADA5320AF35EA8CC6520EBBEF69343354CD593DABC88"
}
}
],
"TransactionIndex": 2,
"TransactionResult": "tesSUCCESS"
},
"validated": true
}
}

View File

@@ -0,0 +1,3 @@
On the live network or the Ripple Test Net, you can wait 4-7 seconds for the ledger to close automatically.
If you're running `rippled` in stand-alone mode, use the [`ledger_accept` command](reference-rippled.html#ledger-accept) to manually close the ledger.

View File

@@ -4,8 +4,8 @@ The XRP Ledger supports held payments, or _escrows_, that can be executed only a
- [Send a time-held escrow](#send-a-time-held-escrow) - [Send a time-held escrow](#send-a-time-held-escrow)
- [Send a conditionally-held escrow](#send-a-conditionally-held-escrow) - [Send a conditionally-held escrow](#send-a-conditionally-held-escrow)
- [Look up escrows where you are the sender](#look-up-escrows-where-you-are-the-sender) - [Look up escrows by sender](#look-up-escrows-by-sender)
- Look up escrows where you are the destination <!-- {# Doesn't work yet:- Look up escrows by destination #}-->
## Availability of Escrow ## Availability of Escrow
@@ -55,59 +55,95 @@ print(release_date_ripple)
### 2. Submit EscrowCreate transaction ### 2. Submit EscrowCreate transaction
[Sign and submit](reference-transaction-format.html#signing-and-submitting-transactions) an [EscrowCreate transaction][]. Set the `FinishAfter` field of the transaction to the time when the held payment should be released. Omit the `Condition` field to make time the only condition for releasing the held payment. Set the `Destination` to the recipient, which can be the same address as the sender. [Sign and submit](reference-transaction-format.html#signing-and-submitting-transactions) an [EscrowCreate transaction][]. Set the `FinishAfter` field of the transaction to the time when the held payment should be released. Omit the `Condition` field to make time the only condition for releasing the held payment. Set the `Destination` to the recipient, which may be the same address as the sender.
{% include 'snippets/secret-key-warning.md' %} {% include 'snippets/secret-key-warning.md' %}
$ rippled submit s████████████████████████████ '{ Request:
> "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
> "TransactionType": "EscrowCreate", <!-- MULTICODE_BLOCK_START -->
> "Amount": "10000",
> "Destination": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW", *Websocket*
> "FinishAfter": 563846400
> }' ```json
{% include 'code_samples/escrow/websocket/submit-request-escrowcreate-time.json' %}
```
<!-- MULTICODE_BLOCK_END -->
Response:
<!-- MULTICODE_BLOCK_START -->
*Websocket*
```json
{% include 'code_samples/escrow/websocket/submit-response-escrowcreate-time.json' %}
```
<!-- MULTICODE_BLOCK_END -->
Take note of the transaction's identifying `hash` value so you can easily check its final status when it is included in a validated ledger version. Take note of the transaction's identifying `hash` value so you can easily check its final status when it is included in a validated ledger version.
### 3. Wait for validation ### 3. Wait for validation
On the live network or the Ripple Test Net, you can wait 4-7 seconds for the ledger to close automatically. {% include 'snippets/wait-for-validation.md' %}
If you're running `rippled` in stand-alone mode, use the [`ledger_accept` command](reference-rippled.html#ledger-accept) to manually close the ledger:
$ rippled ledger_accept
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
"ledger_current_index" : 6,
"status" : "success"
}
}
### 4. Confirm that the escrow was created ### 4. Confirm that the escrow was created
Use the [`tx` command](reference-rippled.html#tx) with the transaction's identifying hash to check its final status. In particular, look for a `CreatedNode` in the transaction metadata to indicate that it created an [Escrow ledger object](reference-ledger-format.html#escrow). Use the [`tx` command](reference-rippled.html#tx) with the transaction's identifying hash to check its final status. Look for a `CreatedNode` in the transaction metadata to indicate that it created an [Escrow ledger object](reference-ledger-format.html#escrow).
Request:
<!-- MULTICODE_BLOCK_START -->
*Websocket*
```json
{% include 'code_samples/escrow/websocket/tx-request-escrowcreate-time.json' %}
```
<!-- MULTICODE_BLOCK_END -->
Response:
<!-- MULTICODE_BLOCK_START -->
*Websocket*
```json
{% include 'code_samples/escrow/websocket/tx-response-escrowcreate-time.json' %}
```
<!-- MULTICODE_BLOCK_END -->
### 5. Wait for the release time ### 5. Wait for the release time
Held payments with a `FinishAfter` time cannot be finished until a ledger has already closed with a [`close_time` header field](reference-ledger-format.html#header-format) that is later than the Escrow node's `FinishAfter` time. Held payments with a `FinishAfter` time cannot be finished until a ledger has already closed with a [`close_time` header field](reference-ledger-format.html#header-format) that is later than the Escrow node's `FinishAfter` time.
You can check the close time of the most recently-closed (not yet validated) ledger with the [`ledger` command](reference-rippled.html#ledger): You can check the close time of the most recently-validated ledger with the [`ledger` command](reference-rippled.html#ledger):
Request:
<!-- MULTICODE_BLOCK_START --> <!-- MULTICODE_BLOCK_START -->
*JSON-RPC* *Websocket*
```json
{% include 'code_samples/escrow/websocket/ledger-request.json' %}
``` ```
{
"method": "ledger", <!-- MULTICODE_BLOCK_END -->
"params": [
{ Response:
"ledger_index": "validated"
} <!-- MULTICODE_BLOCK_START -->
]
} *Websocket*
```json
{% include 'code_samples/escrow/websocket/ledger-response.json' %}
``` ```
<!-- MULTICODE_BLOCK_END --> <!-- MULTICODE_BLOCK_END -->
@@ -121,35 +157,63 @@ You can check the close time of the most recently-closed (not yet validated) led
{% include 'snippets/secret-key-warning.md' %} {% include 'snippets/secret-key-warning.md' %}
$ rippled submit s████████████████████████████ '{ Request:
> "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
> "TransactionType": "EscrowFinish", <!-- MULTICODE_BLOCK_START -->
> "Owner": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
> "OfferSequence": 373, *Websocket*
> }'
```json
{% include 'code_samples/escrow/websocket/submit-request-escrowfinish-time.json' %}
```
<!-- MULTICODE_BLOCK_END -->
Response:
<!-- MULTICODE_BLOCK_START -->
*Websocket*
```json
{% include 'code_samples/escrow/websocket/submit-response-escrowfinish-time.json' %}
```
<!-- MULTICODE_BLOCK_END -->
Take note of the transaction's identifying `hash` value so you can easily check its final status when it is included in a validated ledger version. Take note of the transaction's identifying `hash` value so you can easily check its final status when it is included in a validated ledger version.
### 7. Wait for validation ### 7. Wait for validation
On the live network or the Ripple Test Net, you can wait 4-7 seconds for the ledger to close automatically. {% include 'snippets/wait-for-validation.md' %}
If you're running `rippled` in stand-alone mode, use the [`ledger_accept` command](reference-rippled.html#ledger-accept) to manually close the ledger:
$ rippled ledger_accept
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
"ledger_current_index" : 6,
"status" : "success"
}
}
### 8. Confirm final result ### 8. Confirm final result
Use the [`tx` command](reference-rippled.html#tx) with the EscrowFinish transaction's identifying hash to check its final status. In particular, look in the transaction metadata for a `ModifiedNode` of type `AccountRoot` for the destination of the escrowed payment. The `FinalFields` of the object should reflect the increase in XRP in the `Balance` field. Use the [`tx` command](reference-rippled.html#tx) with the EscrowFinish transaction's identifying hash to check its final status. In particular, look in the transaction metadata for a `ModifiedNode` of type `AccountRoot` for the destination of the escrowed payment. The `FinalFields` of the object should reflect the increase in XRP in the `Balance` field.
Request:
<!-- MULTICODE_BLOCK_START -->
*Websocket*
```json
{% include 'code_samples/escrow/websocket/tx-request-escrowfinish-time.json' %}
```
<!-- MULTICODE_BLOCK_END -->
Response:
<!-- MULTICODE_BLOCK_START -->
*Websocket*
```json
{% include 'code_samples/escrow/websocket/tx-response-escrowfinish-time.json' %}
```
<!-- MULTICODE_BLOCK_END -->
## Send a conditionally-held escrow ## Send a conditionally-held escrow
@@ -191,6 +255,7 @@ _JavaScript_
```js ```js
const rippleOffset = 946684800; const rippleOffset = 946684800;
const CancelAfter = Math.floor(Date.now() / 1000) + (24*60*60) - rippleOffset; const CancelAfter = Math.floor(Date.now() / 1000) + (24*60*60) - rippleOffset;
console.log(CancelAfter);
// Example: 556927412 // Example: 556927412
``` ```
@@ -200,6 +265,7 @@ _Python 2/3_
from time import time from time import time
ripple_offset = 946684800 ripple_offset = 946684800
cancel_after = int(time()) + (24*60*60) - 946684800 cancel_after = int(time()) + (24*60*60) - 946684800
print(cancel_after)
# Example: 556927412 # Example: 556927412
``` ```
@@ -220,18 +286,7 @@ Request:
*Websocket* *Websocket*
```json ```json
{ {% include 'code_samples/escrow/websocket/submit-request-escrowcreate-condition.json' %}
"command": "submit",
"secret": "s████████████████████████████",
"tx_json": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"TransactionType": "EscrowCreate",
"Amount": "100000",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"CancelAfter": 556927412
}
}
``` ```
<!-- MULTICODE_BLOCK_END --> <!-- MULTICODE_BLOCK_END -->
@@ -243,50 +298,14 @@ Response:
*Websocket* *Websocket*
```json ```json
{ {% include 'code_samples/escrow/websocket/submit-response-escrowcreate-condition.json' %}
"id": 1,
"status": "success",
"type": "response",
"result": {
"engine_result": "tesSUCCESS",
"engine_result_code": 0,
"engine_result_message": "The transaction was applied. Only final in a validated ledger.",
"tx_blob": "120001228000000024000000052024213209B46140000000000186A068400000000000000A732103E498E35BC1E109C5995BD3AB0A6D4FFAB61B853C8F6010FABC5DABAF34478B61744730450221008AC8BDC2151D5EF956197F0E6E89A4F49DEADC1AC38367870E444B1EA8D88D97022075E31427B455DFF87F0F22B849C71FC3987A91C19D63B6D0242E808347EC8A8F701127A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD81012081149A2AA667E1517EFA8A6B552AB2EDB859A99F26B283144B4E9C06F24296074F7BC48F92A97916C6DC5EA9",
"tx_json": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Amount": "100000",
"CancelAfter": 556927412,
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Fee": "10",
"Flags": 2147483648,
"Sequence": 5,
"SigningPubKey": "03E498E35BC1E109C5995BD3AB0A6D4FFAB61B853C8F6010FABC5DABAF34478B61",
"TransactionType": "EscrowCreate",
"TxnSignature": "30450221008AC8BDC2151D5EF956197F0E6E89A4F49DEADC1AC38367870E444B1EA8D88D97022075E31427B455DFF87F0F22B849C71FC3987A91C19D63B6D0242E808347EC8A8F",
"hash": "E22D1F6EB006CAD35E0DBD3B4F3748427055E4C143EBE95AA6603823AEEAD324"
}
}
}
``` ```
<!-- MULTICODE_BLOCK_END --> <!-- MULTICODE_BLOCK_END -->
### 4. Wait for validation ### 4. Wait for validation
On the live network or the Ripple Test Net, you can wait 4-7 seconds for the ledger to close automatically. {% include 'snippets/wait-for-validation.md' %}
If you're running `rippled` in stand-alone mode, use the [`ledger_accept` command](reference-rippled.html#ledger-accept) to manually close the ledger:
$ rippled ledger_accept
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
"ledger_current_index" : 7,
"status" : "success"
}
}
### 5. Confirm that the escrow was created ### 5. Confirm that the escrow was created
@@ -299,10 +318,7 @@ Request:
*Websocket* *Websocket*
```json ```json
{ {% include 'code_samples/escrow/websocket/tx-request-escrowcreate-condition.json' %}
"command": "tx",
"transaction": "E22D1F6EB006CAD35E0DBD3B4F3748427055E4C143EBE95AA6603823AEEAD324"
}
``` ```
<!-- MULTICODE_BLOCK_END --> <!-- MULTICODE_BLOCK_END -->
@@ -314,94 +330,14 @@ Response:
*Websocket* *Websocket*
```json ```json
{ {% include 'code_samples/escrow/websocket/tx-response-escrowcreate-condition.json' %}
"id": 3,
"status": "success",
"type": "response",
"result": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Amount": "100000",
"CancelAfter": 556927412,
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Fee": "10",
"Flags": 2147483648,
"Sequence": 5,
"SigningPubKey": "03E498E35BC1E109C5995BD3AB0A6D4FFAB61B853C8F6010FABC5DABAF34478B61",
"TransactionType": "EscrowCreate",
"TxnSignature": "30450221008AC8BDC2151D5EF956197F0E6E89A4F49DEADC1AC38367870E444B1EA8D88D97022075E31427B455DFF87F0F22B849C71FC3987A91C19D63B6D0242E808347EC8A8F",
"date": 556841101,
"hash": "E22D1F6EB006CAD35E0DBD3B4F3748427055E4C143EBE95AA6603823AEEAD324",
"inLedger": 1772019,
"ledger_index": 1772019,
"meta": {
"AffectedNodes": [
{
"ModifiedNode": {
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8",
"PreviousTxnID": "52C4F626FE6F33699B6BE8ADF362836DDCE9B0B1294BFAA15D65D61501350BE6",
"PreviousTxnLgrSeq": 1771204
}
},
{
"ModifiedNode": {
"FinalFields": {
"Flags": 0,
"Owner": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"RootIndex": "4B4EBB6D8563075813D47491CC325865DFD3DC2E94889F0F39D59D9C059DD81F"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "4B4EBB6D8563075813D47491CC325865DFD3DC2E94889F0F39D59D9C059DD81F"
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Balance": "9999798970",
"Flags": 0,
"OwnerCount": 1,
"Sequence": 6
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "5F3B7107F4B524367A173A2B0EAB66E8CC4D2178C1B0C0528CB2F73A8B6BF254",
"PreviousFields": {
"Balance": "9999898980",
"OwnerCount": 0,
"Sequence": 5
},
"PreviousTxnID": "52C4F626FE6F33699B6BE8ADF362836DDCE9B0B1294BFAA15D65D61501350BE6",
"PreviousTxnLgrSeq": 1771204
}
},
{
"CreatedNode": {
"LedgerEntryType": "Escrow",
"LedgerIndex": "E2CF730A31FD419382350C9DBD8DB7CD775BA5AA9B97A9BE9AB07304AA217A75",
"NewFields": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Amount": "100000",
"CancelAfter": 556927412,
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn"
}
}
}
],
"TransactionIndex": 0,
"TransactionResult": "tesSUCCESS"
},
"validated": true
}
}
``` ```
<!-- MULTICODE_BLOCK_END --> <!-- MULTICODE_BLOCK_END -->
### 6. Submit EscrowFinish transaction ### 6. Submit EscrowFinish transaction
[Sign and submit](reference-transaction-format.html#signing-and-submitting-transactions) an [EscrowCreate transaction][] to execute the release of the funds after the `FinishAfter` time has passed. Set the `Owner` field of the transaction to the `Account` address from the EscrowCreate transaction, and the `OfferSequence` to the `Sequence` number from the EscrowCreate transaction. Set the `Condition` and `Fulfillment` fields to the condition and fulfillment values, in hexadecimal, that you generated in step 1. [Sign and submit](reference-transaction-format.html#signing-and-submitting-transactions) an [EscrowCreate transaction][] to execute the release of the funds after the `FinishAfter` time has passed. Set the `Owner` field of the transaction to the `Account` address from the EscrowCreate transaction, and the `OfferSequence` to the `Sequence` number from the EscrowCreate transaction. Set the `Condition` and `Fulfillment` fields to the condition and fulfillment values, in hexadecimal, that you generated in step 1. Set the `Fee` ([transaction cost](concept-transaction-cost.html)) value based on the size of the fulfillment in bytes: a conditional EscrowFinish requires at least 330 drops of XRP plus 10 drops per 16 bytes in the size of the fulfillment.
**Note:** If you included a `FinishAfter` field in the EscrowCreate transaction, you cannot execute it before that time has passed, even if you provide the correct fulfillment for the Escrow's condition. The EscrowFinish transaction fails with the [result code](reference-transactions.html#transaction-results) `tecNO_PERMISSION` if the previously-closed ledger's close time is before the `FinishAfter` time. **Note:** If you included a `FinishAfter` field in the EscrowCreate transaction, you cannot execute it before that time has passed, even if you provide the correct fulfillment for the Escrow's condition. The EscrowFinish transaction fails with the [result code](reference-transactions.html#transaction-results) `tecNO_PERMISSION` if the previously-closed ledger's close time is before the `FinishAfter` time.
@@ -412,19 +348,7 @@ Response:
_Websocket_ _Websocket_
```json ```json
{ {% include 'code_samples/escrow/websocket/submit-request-escrowfinish-condition.json' %}
"command": "submit",
"secret": "s████████████████████████████",
"tx_json": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"TransactionType": "EscrowFinish",
"Owner": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"OfferSequence": 5,
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Fulfillment": "A0228020D280D1A02BAD0D2EBC0528B92E9BF37AC3E2530832C2C52620307135156F1048",
"Fee": "500"
}
}
``` ```
<!-- MULTICODE_BLOCK_END --> <!-- MULTICODE_BLOCK_END -->
@@ -436,31 +360,7 @@ Response:
_Websocket_ _Websocket_
```json ```json
{ {% include 'code_samples/escrow/websocket/submit-response-escrowfinish-condition.json' %}
"id": 4,
"status": "success",
"type": "response",
"result": {
"engine_result": "tesSUCCESS",
"engine_result_code": 0,
"engine_result_message": "The transaction was applied. Only final in a validated ledger.",
"tx_blob": "120002228000000024000000062019000000056840000000000001F4732103E498E35BC1E109C5995BD3AB0A6D4FFAB61B853C8F6010FABC5DABAF34478B617446304402207DE4EA9C8655E75BA01F96345B3F62074313EB42C15D9C4871E30F02202D2BA50220070E52AD308A31AC71E33BA342F31B68D1D1B2A7A3A3ED6E8552CA3DCF14FBB2701024A0228020D280D1A02BAD0D2EBC0528B92E9BF37AC3E2530832C2C52620307135156F1048701127A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD81012081149A2AA667E1517EFA8A6B552AB2EDB859A99F26B282149A2AA667E1517EFA8A6B552AB2EDB859A99F26B2",
"tx_json": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Fee": "500",
"Flags": 2147483648,
"Fulfillment": "A0228020D280D1A02BAD0D2EBC0528B92E9BF37AC3E2530832C2C52620307135156F1048",
"OfferSequence": 5,
"Owner": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Sequence": 6,
"SigningPubKey": "03E498E35BC1E109C5995BD3AB0A6D4FFAB61B853C8F6010FABC5DABAF34478B61",
"TransactionType": "EscrowFinish",
"TxnSignature": "304402207DE4EA9C8655E75BA01F96345B3F62074313EB42C15D9C4871E30F02202D2BA50220070E52AD308A31AC71E33BA342F31B68D1D1B2A7A3A3ED6E8552CA3DCF14FBB2",
"hash": "0E88368CAFC69A722ED829FAE6E2DD3575AE9C192691E60B5ACDF706E219B2BF"
}
}
}
``` ```
<!-- MULTICODE_BLOCK_END --> <!-- MULTICODE_BLOCK_END -->
@@ -469,19 +369,7 @@ Take note of the transaction's identifying `hash` value so you can easily check
### 7. Wait for validation ### 7. Wait for validation
On the live network or the Ripple Test Net, you can wait 4-7 seconds for the ledger to close automatically. {% include 'snippets/wait-for-validation.md' %}
If you're running `rippled` in stand-alone mode, use the [`ledger_accept` command](reference-rippled.html#ledger-accept) to manually close the ledger:
$ rippled ledger_accept
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
"ledger_current_index" : 8,
"status" : "success"
}
}
### 8. Confirm final result ### 8. Confirm final result
@@ -490,115 +378,17 @@ Use the [`tx` command](reference-rippled.html#tx) with the EscrowFinish transact
Request: Request:
```json ```json
{ {% include 'code_samples/escrow/websocket/tx-request-escrowfinish-condition.json' %}
"id": 20,
"command": "tx",
"transaction": "52C4F626FE6F33699B6BE8ADF362836DDCE9B0B1294BFAA15D65D61501350BE6"
}
``` ```
Response: Response:
```json ```json
{ {% include 'code_samples/escrow/websocket/tx-response-escrowfinish-condition.json' %}
"id": 20,
"status": "success",
"type": "response",
"result": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Fee": "500",
"Flags": 2147483648,
"Fulfillment": "A0228020D280D1A02BAD0D2EBC0528B92E9BF37AC3E2530832C2C52620307135156F1048",
"OfferSequence": 2,
"Owner": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Sequence": 4,
"SigningPubKey": "03E498E35BC1E109C5995BD3AB0A6D4FFAB61B853C8F6010FABC5DABAF34478B61",
"TransactionType": "EscrowFinish",
"TxnSignature": "3045022100925FEBE21C2E57F81C472A4E5869CAB1D0164C472A46532F39F6F9F7ED6846D002202CF9D9063ADC4CC0ADF4C4692B7EE165C5D124CAA855649389E245D993F41D4D",
"date": 556838610,
"hash": "52C4F626FE6F33699B6BE8ADF362836DDCE9B0B1294BFAA15D65D61501350BE6",
"inLedger": 1771204,
"ledger_index": 1771204,
"meta": {
"AffectedNodes": [
{
"ModifiedNode": {
"FinalFields": {
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Balance": "400100000",
"Flags": 0,
"OwnerCount": 0,
"Sequence": 1
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8",
"PreviousFields": {
"Balance": "400000000"
},
"PreviousTxnID": "795CBC8AFAAB9DC7BD9944C7FAEABF9BB0802A84520BC649213AD6A2C3256C95",
"PreviousTxnLgrSeq": 1770775
}
},
{
"ModifiedNode": {
"FinalFields": {
"Flags": 0,
"Owner": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"RootIndex": "4B4EBB6D8563075813D47491CC325865DFD3DC2E94889F0F39D59D9C059DD81F"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "4B4EBB6D8563075813D47491CC325865DFD3DC2E94889F0F39D59D9C059DD81F"
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Balance": "9999898980",
"Flags": 0,
"OwnerCount": 0,
"Sequence": 5
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "5F3B7107F4B524367A173A2B0EAB66E8CC4D2178C1B0C0528CB2F73A8B6BF254",
"PreviousFields": {
"Balance": "9999899480",
"OwnerCount": 1,
"Sequence": 4
},
"PreviousTxnID": "5C2A1E7B209A7404D3722A010D331A8C1C853109A47DDF620DE5E3D59F026581",
"PreviousTxnLgrSeq": 1771042
}
},
{
"DeletedNode": {
"FinalFields": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Amount": "100000",
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"FinishAfter": 556838185,
"Flags": 0,
"OwnerNode": "0000000000000000",
"PreviousTxnID": "795CBC8AFAAB9DC7BD9944C7FAEABF9BB0802A84520BC649213AD6A2C3256C95",
"PreviousTxnLgrSeq": 1770775
},
"LedgerEntryType": "Escrow",
"LedgerIndex": "DC524D17B3F650E7A215B332F418E54AE59B0DFC5392E74958B0037AFDFE8C8D"
}
}
],
"TransactionIndex": 1,
"TransactionResult": "tesSUCCESS"
},
"validated": true
}
}
``` ```
## Look up escrows where you are the sender ## Look up escrows by sender
All pending escrows are stored in the ledger as [Escrow objects](reference-ledger-format.html#escrow). You can look up escrow nodes owned by your address using the [`account_objects` method](reference-rippled.html#account-objects). All pending escrows are stored in the ledger as [Escrow objects](reference-ledger-format.html#escrow). You can look up escrow nodes owned by your address using the [`account_objects` method](reference-rippled.html#account-objects).
@@ -609,13 +399,7 @@ Request:
_Websocket_ _Websocket_
```json ```json
{ {% include 'code_samples/escrow/websocket/account_objects-request-sender.json' %}
"id": 5,
"command": "account_objects",
"account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"ledger_index": "validated",
"type": "escrow"
}
``` ```
<!-- MULTICODE_BLOCK_END --> <!-- MULTICODE_BLOCK_END -->
@@ -627,32 +411,7 @@ Response:
_Websocket_ _Websocket_
```json ```json
{ {% include 'code_samples/escrow/websocket/account_objects-response-sender.json' %}
"id": 5,
"status": "success",
"type": "response",
"result": {
"account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"account_objects": [
{
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"Amount": "100000",
"CancelAfter": 556927412,
"Condition": "A0258020E24D9E1473D4DF774F6D8E089067282034E4FA7ECACA2AD2E547953B2C113CBD810120",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Flags": 0,
"LedgerEntryType": "Escrow",
"OwnerNode": "0000000000000000",
"PreviousTxnID": "E22D1F6EB006CAD35E0DBD3B4F3748427055E4C143EBE95AA6603823AEEAD324",
"PreviousTxnLgrSeq": 1772019,
"index": "E2CF730A31FD419382350C9DBD8DB7CD775BA5AA9B97A9BE9AB07304AA217A75"
}
],
"ledger_hash": "F2ABEA175F4AB871845B01CB51E4324DBA2C2553EC34448D4AB1EB0A3F2D8EFB",
"ledger_index": 1772020,
"validated": true
}
}
``` ```
<!-- MULTICODE_BLOCK_END --> <!-- MULTICODE_BLOCK_END -->

View File

@@ -165,7 +165,7 @@
<li class="level-3"><a href="#6-submit-escrowfinish-transaction-1">6. Submit EscrowFinish transaction</a></li> <li class="level-3"><a href="#6-submit-escrowfinish-transaction-1">6. Submit EscrowFinish transaction</a></li>
<li class="level-3"><a href="#7-wait-for-validation-1">7. Wait for validation</a></li> <li class="level-3"><a href="#7-wait-for-validation-1">7. Wait for validation</a></li>
<li class="level-3"><a href="#8-confirm-final-result-1">8. Confirm final result</a></li> <li class="level-3"><a href="#8-confirm-final-result-1">8. Confirm final result</a></li>
<li class="level-2"><a href="#look-up-escrows-where-you-are-the-sender">Look up escrows where you are the sender</a></li> <li class="level-2"><a href="#look-up-escrows-by-sender">Look up escrows by sender</a></li>
</ul> </ul>
</div> </div>
@@ -178,8 +178,8 @@
<ul> <ul>
<li><a href="#send-a-time-held-escrow">Send a time-held escrow</a></li> <li><a href="#send-a-time-held-escrow">Send a time-held escrow</a></li>
<li><a href="#send-a-conditionally-held-escrow">Send a conditionally-held escrow</a></li> <li><a href="#send-a-conditionally-held-escrow">Send a conditionally-held escrow</a></li>
<li><a href="#look-up-escrows-where-you-are-the-sender">Look up escrows where you are the sender</a></li> <li><a href="#look-up-escrows-by-sender">Look up escrows by sender</a>
<li>Look up escrows where you are the destination</li> <!-- --></li>
</ul> </ul>
<h2 id="availability-of-escrow">Availability of Escrow</h2> <h2 id="availability-of-escrow">Availability of Escrow</h2>
<p>Held payments been enabled by the <a href="concept-amendments.html#escrow">"Escrow" Amendment</a> to the XRP Ledger Consensus Protocol since 2017-03-31. A previous version of the same functionality was available on the <a href="https://ripple.com/build/ripple-test-net/">Ripple Test Net</a> by the name "Suspended Payments" (SusPay) in 2016.</p> <p>Held payments been enabled by the <a href="concept-amendments.html#escrow">"Escrow" Amendment</a> to the XRP Ledger Consensus Protocol since 2017-03-31. A previous version of the same functionality was available on the <a href="https://ripple.com/build/ripple-test-net/">Ripple Test Net</a> by the name "Suspended Payments" (SusPay) in 2016.</p>
@@ -210,44 +210,195 @@ print(release_date_ripple)
</div> </div>
<p class="devportal-callout warning"><strong>Warning:</strong> If you use a UNIX time in the <code>FinishAfter</code> field without converting to the equivalent Ripple time first, that sets the unlock time to an extra <strong>30 years</strong> in the future!</p> <p class="devportal-callout warning"><strong>Warning:</strong> If you use a UNIX time in the <code>FinishAfter</code> field without converting to the equivalent Ripple time first, that sets the unlock time to an extra <strong>30 years</strong> in the future!</p>
<h3 id="2-submit-escrowcreate-transaction">2. Submit EscrowCreate transaction</h3> <h3 id="2-submit-escrowcreate-transaction">2. Submit EscrowCreate transaction</h3>
<p><a href="reference-transaction-format.html#signing-and-submitting-transactions">Sign and submit</a> an <a href="reference-transaction-format.html#escrowcreate">EscrowCreate transaction</a>. Set the <code>FinishAfter</code> field of the transaction to the time when the held payment should be released. Omit the <code>Condition</code> field to make time the only condition for releasing the held payment. Set the <code>Destination</code> to the recipient, which can be the same address as the sender.</p> <p><a href="reference-transaction-format.html#signing-and-submitting-transactions">Sign and submit</a> an <a href="reference-transaction-format.html#escrowcreate">EscrowCreate transaction</a>. Set the <code>FinishAfter</code> field of the transaction to the time when the held payment should be released. Omit the <code>Condition</code> field to make time the only condition for releasing the held payment. Set the <code>Destination</code> to the recipient, which may be the same address as the sender.</p>
<p class="devportal-callout caution"><strong>Caution:</strong> Never submit a secret key to a server you do not control. Do not send a secret key unencrypted over the network.</p> <p class="devportal-callout caution"><strong>Caution:</strong> Never submit a secret key to a server you do not control. Do not send a secret key unencrypted over the network.</p>
<pre><code>$ rippled submit s████████████████████████████ '{ <p>Request:</p>
&gt; "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", <div class="multicode" id="code-1"><ul class="codetabs"><li><a href="#code-1-0">Websocket</a></li></ul>
&gt; "TransactionType": "EscrowCreate",
&gt; "Amount": "10000", <div class="code_sample" id="code-1-0" style="position: static;"><pre><code class="json">{
&gt; "Destination": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW", "command": "submit",
&gt; "FinishAfter": 563846400 "secret": "s████████████████████████████",
&gt; }' "tx_json": {
</code></pre> "Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"TransactionType": "EscrowCreate",
"Amount": "10000",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"FinishAfter": 557020800
}
}
</code></pre></div>
</div>
<p>Response:</p>
<div class="multicode" id="code-2"><ul class="codetabs"><li><a href="#code-2-0">Websocket</a></li></ul>
<div class="code_sample" id="code-2-0" style="position: static;"><pre><code class="json">{
"id": 2,
"status": "success",
"type": "response",
"result": {
"engine_result": "tesSUCCESS",
"engine_result_code": 0,
"engine_result_message": "The transaction was applied. Only final in a validated ledger.",
"tx_blob": "1200012280000000240000000120252133768061400000000000271068400000000000000A732103C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E437446304402203C9AA4C21E1A1A7427D41583283E7A513DDBDD967B246CADD3B2705D858A7A8E02201BEA7B923B18910EEB9F306F6DE3B3F53549BBFAD46335B62B4C34A6DCB4A47681143EEB46C355B04EE8D08E8EED00F422895C79EA6A83144B4E9C06F24296074F7BC48F92A97916C6DC5EA9",
"tx_json": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Amount": "10000",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Fee": "10",
"FinishAfter": 557020800,
"Flags": 2147483648,
"Sequence": 1,
"SigningPubKey": "03C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E43",
"TransactionType": "EscrowCreate",
"TxnSignature": "304402203C9AA4C21E1A1A7427D41583283E7A513DDBDD967B246CADD3B2705D858A7A8E02201BEA7B923B18910EEB9F306F6DE3B3F53549BBFAD46335B62B4C34A6DCB4A476",
"hash": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263"
}
}
}
</code></pre></div>
</div>
<p>Take note of the transaction's identifying <code>hash</code> value so you can easily check its final status when it is included in a validated ledger version.</p> <p>Take note of the transaction's identifying <code>hash</code> value so you can easily check its final status when it is included in a validated ledger version.</p>
<h3 id="3-wait-for-validation">3. Wait for validation</h3> <h3 id="3-wait-for-validation">3. Wait for validation</h3>
<p>On the live network or the Ripple Test Net, you can wait 4-7 seconds for the ledger to close automatically.</p> <p>On the live network or the Ripple Test Net, you can wait 4-7 seconds for the ledger to close automatically.</p>
<p>If you're running <code>rippled</code> in stand-alone mode, use the <a href="reference-rippled.html#ledger-accept"><code>ledger_accept</code> command</a> to manually close the ledger:</p> <p>If you're running <code>rippled</code> in stand-alone mode, use the <a href="reference-rippled.html#ledger-accept"><code>ledger_accept</code> command</a> to manually close the ledger.</p>
<pre><code>$ rippled ledger_accept
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
"ledger_current_index" : 6,
"status" : "success"
}
}
</code></pre>
<h3 id="4-confirm-that-the-escrow-was-created">4. Confirm that the escrow was created</h3> <h3 id="4-confirm-that-the-escrow-was-created">4. Confirm that the escrow was created</h3>
<p>Use the <a href="reference-rippled.html#tx"><code>tx</code> command</a> with the transaction's identifying hash to check its final status. In particular, look for a <code>CreatedNode</code> in the transaction metadata to indicate that it created an <a href="reference-ledger-format.html#escrow">Escrow ledger object</a>.</p> <p>Use the <a href="reference-rippled.html#tx"><code>tx</code> command</a> with the transaction's identifying hash to check its final status. Look for a <code>CreatedNode</code> in the transaction metadata to indicate that it created an <a href="reference-ledger-format.html#escrow">Escrow ledger object</a>.</p>
<p>Request:</p>
<div class="multicode" id="code-3"><ul class="codetabs"><li><a href="#code-3-0">Websocket</a></li></ul>
<div class="code_sample" id="code-3-0" style="position: static;"><pre><code class="json">{
"id": 3,
"command": "tx",
"transaction": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263"
}
</code></pre></div>
</div>
<p>Response:</p>
<div class="multicode" id="code-4"><ul class="codetabs"><li><a href="#code-4-0">Websocket</a></li></ul>
<div class="code_sample" id="code-4-0" style="position: static;"><pre><code class="json">{
"id": 3,
"status": "success",
"type": "response",
"result": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Amount": "10000",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Fee": "10",
"FinishAfter": 557020800,
"Flags": 2147483648,
"Sequence": 1,
"SigningPubKey": "03C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E43",
"TransactionType": "EscrowCreate",
"TxnSignature": "304402203C9AA4C21E1A1A7427D41583283E7A513DDBDD967B246CADD3B2705D858A7A8E02201BEA7B923B18910EEB9F306F6DE3B3F53549BBFAD46335B62B4C34A6DCB4A476",
"date": 557014081,
"hash": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263",
"inLedger": 1828796,
"ledger_index": 1828796,
"meta": {
"AffectedNodes": [
{
"ModifiedNode": {
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8",
"PreviousTxnID": "613B28E0890FC975F2CBA3D700F75116F623B1E3FE48CB7CB2EB216EAD6F097D",
"PreviousTxnLgrSeq": 1799920
}
},
{
"CreatedNode": {
"LedgerEntryType": "Escrow",
"LedgerIndex": "2B9845CB9DF686B9615BF04F3EC66095A334D985E03E71B893B90FCF6D4DC9E6",
"NewFields": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Amount": "10000",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"FinishAfter": 557020800
}
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Balance": "9999989990",
"Flags": 0,
"OwnerCount": 1,
"Sequence": 2
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "AE5AB6584A76C37C7382B6880609FC7792D90CDA36FF362AF412EB914C1715D3",
"PreviousFields": {
"Balance": "10000000000",
"OwnerCount": 0,
"Sequence": 1
},
"PreviousTxnID": "F181D45FD094A7417926F791D9DF958B84CE4B7B3D92CC9DDCACB1D5EC59AAAA",
"PreviousTxnLgrSeq": 1828732
}
},
{
"CreatedNode": {
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "D623EBEEEE701D4323D0ADA5320AF35EA8CC6520EBBEF69343354CD593DABC88",
"NewFields": {
"Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"RootIndex": "D623EBEEEE701D4323D0ADA5320AF35EA8CC6520EBBEF69343354CD593DABC88"
}
}
}
],
"TransactionIndex": 3,
"TransactionResult": "tesSUCCESS"
},
"validated": true
}
}
</code></pre></div>
</div>
<h3 id="5-wait-for-the-release-time">5. Wait for the release time</h3> <h3 id="5-wait-for-the-release-time">5. Wait for the release time</h3>
<p>Held payments with a <code>FinishAfter</code> time cannot be finished until a ledger has already closed with a <a href="reference-ledger-format.html#header-format"><code>close_time</code> header field</a> that is later than the Escrow node's <code>FinishAfter</code> time.</p> <p>Held payments with a <code>FinishAfter</code> time cannot be finished until a ledger has already closed with a <a href="reference-ledger-format.html#header-format"><code>close_time</code> header field</a> that is later than the Escrow node's <code>FinishAfter</code> time.</p>
<p>You can check the close time of the most recently-closed (not yet validated) ledger with the <a href="reference-rippled.html#ledger"><code>ledger</code> command</a>:</p> <p>You can check the close time of the most recently-validated ledger with the <a href="reference-rippled.html#ledger"><code>ledger</code> command</a>:</p>
<div class="multicode" id="code-1"><ul class="codetabs"><li><a href="#code-1-0">JSON-RPC</a></li></ul> <p>Request:</p>
<div class="multicode" id="code-5"><ul class="codetabs"><li><a href="#code-5-0">Websocket</a></li></ul>
<div class="code_sample" id="code-1-0" style="position: static;"><pre><code>{ <div class="code_sample" id="code-5-0" style="position: static;"><pre><code class="json">{
"method": "ledger", "id": 4,
"params": [ "command": "ledger",
{ "ledger_index": "validated"
"ledger_index": "validated" }
} </code></pre></div>
] </div>
<p>Response:</p>
<div class="multicode" id="code-6"><ul class="codetabs"><li><a href="#code-6-0">Websocket</a></li></ul>
<div class="code_sample" id="code-6-0" style="position: static;"><pre><code class="json">{
"id": 4,
"status": "success",
"type": "response",
"result": {
"ledger": {
"accepted": true,
"account_hash": "3B5A8FF5334F94F4D3D09F236F9D1B4C028FCAE30948ACC986D461DDEE1D886B",
"close_flags": 0,
"close_time": 557256670,
"close_time_human": "2017-Aug-28 17:31:10",
"close_time_resolution": 10,
"closed": true,
"hash": "A999223A80174A7CB39D766B625C9E476F24AD2F15860A712CD029EE5ED1C320",
"ledger_hash": "A999223A80174A7CB39D766B625C9E476F24AD2F15860A712CD029EE5ED1C320",
"ledger_index": "1908253",
"parent_close_time": 557256663,
"parent_hash": "6A70C5336ACFDA05760D827776079F7A544D2361CFD5B21BD55A92AA20477A61",
"seqNum": "1908253",
"totalCoins": "99997280690562728",
"total_coins": "99997280690562728",
"transaction_hash": "49A51DFB1CAB2F134D93D5D1C5FF55A15B12DA36DAF9F5862B17C47EE966647D"
},
"ledger_hash": "A999223A80174A7CB39D766B625C9E476F24AD2F15860A712CD029EE5ED1C320",
"ledger_index": 1908253,
"validated": true
}
} }
</code></pre></div> </code></pre></div>
</div> </div>
@@ -255,29 +406,162 @@ Connecting to 127.0.0.1:5005
<p><a href="reference-transaction-format.html#signing-and-submitting-transactions">Sign and submit</a> an <a href="reference-transaction-format.html#escrowcreate">EscrowCreate transaction</a> to execute the release of the funds after the <code>FinishAfter</code> time has passed. Set the <code>Owner</code> field of the transaction to the <code>Account</code> address from the EscrowCreate transaction, and the <code>OfferSequence</code> to the <code>Sequence</code> number from the EscrowCreate transaction. For an escrow held only by time, omit the <code>Condition</code> and <code>Fulfillment</code> fields.</p> <p><a href="reference-transaction-format.html#signing-and-submitting-transactions">Sign and submit</a> an <a href="reference-transaction-format.html#escrowcreate">EscrowCreate transaction</a> to execute the release of the funds after the <code>FinishAfter</code> time has passed. Set the <code>Owner</code> field of the transaction to the <code>Account</code> address from the EscrowCreate transaction, and the <code>OfferSequence</code> to the <code>Sequence</code> number from the EscrowCreate transaction. For an escrow held only by time, omit the <code>Condition</code> and <code>Fulfillment</code> fields.</p>
<p class="devportal-callout tip"><strong>Tip:</strong> The EscrowFinish transaction is necessary because the XRP Ledger's state can only be modified by transactions. The sender of this transaction may be the recipient of the escrow, the original sender of the escrow, or any other XRP Ledger address.</p> <p class="devportal-callout tip"><strong>Tip:</strong> The EscrowFinish transaction is necessary because the XRP Ledger's state can only be modified by transactions. The sender of this transaction may be the recipient of the escrow, the original sender of the escrow, or any other XRP Ledger address.</p>
<p class="devportal-callout caution"><strong>Caution:</strong> Never submit a secret key to a server you do not control. Do not send a secret key unencrypted over the network.</p> <p class="devportal-callout caution"><strong>Caution:</strong> Never submit a secret key to a server you do not control. Do not send a secret key unencrypted over the network.</p>
<pre><code>$ rippled submit s████████████████████████████ '{ <p>Request:</p>
&gt; "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", <div class="multicode" id="code-7"><ul class="codetabs"><li><a href="#code-7-0">Websocket</a></li></ul>
&gt; "TransactionType": "EscrowFinish",
&gt; "Owner": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", <div class="code_sample" id="code-7-0" style="position: static;"><pre><code class="json">{
&gt; "OfferSequence": 373, "command": "submit",
&gt; }' "secret": "s████████████████████████████",
</code></pre> "tx_json": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"TransactionType": "EscrowFinish",
"Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"OfferSequence": 1
}
}
</code></pre></div>
</div>
<p>Response:</p>
<div class="multicode" id="code-8"><ul class="codetabs"><li><a href="#code-8-0">Websocket</a></li></ul>
<div class="code_sample" id="code-8-0" style="position: static;"><pre><code class="json">{
"id": 1,
"status": "success",
"type": "response",
"result": {
"engine_result": "tesSUCCESS",
"engine_result_code": 0,
"engine_result_message": "The transaction was applied. Only final in a validated ledger.",
"tx_blob": "1200022280000000240000000220190000000168400000000000000A732103C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E4374473045022100923B91BA4FD6450813F5335D71C64BA9EB81304A86859A631F2AD8571424A46502200CCE660D36781B84634C5F23619EB6CFCCF942709F54DCCF27CF6F499AE78C9B81143EEB46C355B04EE8D08E8EED00F422895C79EA6A82143EEB46C355B04EE8D08E8EED00F422895C79EA6A",
"tx_json": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Fee": "10",
"Flags": 2147483648,
"OfferSequence": 1,
"Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Sequence": 2,
"SigningPubKey": "03C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E43",
"TransactionType": "EscrowFinish",
"TxnSignature": "3045022100923B91BA4FD6450813F5335D71C64BA9EB81304A86859A631F2AD8571424A46502200CCE660D36781B84634C5F23619EB6CFCCF942709F54DCCF27CF6F499AE78C9B",
"hash": "41856A742B3CAF307E7B4D0B850F302101F0F415B785454F7501E9960A2A1F6B"
}
}
}
</code></pre></div>
</div>
<p>Take note of the transaction's identifying <code>hash</code> value so you can easily check its final status when it is included in a validated ledger version.</p> <p>Take note of the transaction's identifying <code>hash</code> value so you can easily check its final status when it is included in a validated ledger version.</p>
<h3 id="7-wait-for-validation">7. Wait for validation</h3> <h3 id="7-wait-for-validation">7. Wait for validation</h3>
<p>On the live network or the Ripple Test Net, you can wait 4-7 seconds for the ledger to close automatically.</p> <p>On the live network or the Ripple Test Net, you can wait 4-7 seconds for the ledger to close automatically.</p>
<p>If you're running <code>rippled</code> in stand-alone mode, use the <a href="reference-rippled.html#ledger-accept"><code>ledger_accept</code> command</a> to manually close the ledger:</p> <p>If you're running <code>rippled</code> in stand-alone mode, use the <a href="reference-rippled.html#ledger-accept"><code>ledger_accept</code> command</a> to manually close the ledger.</p>
<pre><code>$ rippled ledger_accept
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
"ledger_current_index" : 6,
"status" : "success"
}
}
</code></pre>
<h3 id="8-confirm-final-result">8. Confirm final result</h3> <h3 id="8-confirm-final-result">8. Confirm final result</h3>
<p>Use the <a href="reference-rippled.html#tx"><code>tx</code> command</a> with the EscrowFinish transaction's identifying hash to check its final status. In particular, look in the transaction metadata for a <code>ModifiedNode</code> of type <code>AccountRoot</code> for the destination of the escrowed payment. The <code>FinalFields</code> of the object should reflect the increase in XRP in the <code>Balance</code> field.</p> <p>Use the <a href="reference-rippled.html#tx"><code>tx</code> command</a> with the EscrowFinish transaction's identifying hash to check its final status. In particular, look in the transaction metadata for a <code>ModifiedNode</code> of type <code>AccountRoot</code> for the destination of the escrowed payment. The <code>FinalFields</code> of the object should reflect the increase in XRP in the <code>Balance</code> field.</p>
<p>Request:</p>
<div class="multicode" id="code-9"><ul class="codetabs"><li><a href="#code-9-0">Websocket</a></li></ul>
<div class="code_sample" id="code-9-0" style="position: static;"><pre><code class="json">{
"id": 21,
"command": "tx",
"transaction": "41856A742B3CAF307E7B4D0B850F302101F0F415B785454F7501E9960A2A1F6B"
}
</code></pre></div>
</div>
<p>Response:</p>
<div class="multicode" id="code-10"><ul class="codetabs"><li><a href="#code-10-0">Websocket</a></li></ul>
<div class="code_sample" id="code-10-0" style="position: static;"><pre><code class="json">{
"id": 2,
"status": "success",
"type": "response",
"result": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Fee": "10",
"Flags": 2147483648,
"OfferSequence": 1,
"Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Sequence": 2,
"SigningPubKey": "03C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E43",
"TransactionType": "EscrowFinish",
"TxnSignature": "3045022100923B91BA4FD6450813F5335D71C64BA9EB81304A86859A631F2AD8571424A46502200CCE660D36781B84634C5F23619EB6CFCCF942709F54DCCF27CF6F499AE78C9B",
"date": 557256681,
"hash": "41856A742B3CAF307E7B4D0B850F302101F0F415B785454F7501E9960A2A1F6B",
"inLedger": 1908257,
"ledger_index": 1908257,
"meta": {
"AffectedNodes": [
{
"ModifiedNode": {
"FinalFields": {
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Balance": "400210000",
"Flags": 0,
"OwnerCount": 0,
"Sequence": 1
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8",
"PreviousFields": {
"Balance": "400200000"
},
"PreviousTxnID": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263",
"PreviousTxnLgrSeq": 1828796
}
},
{
"DeletedNode": {
"FinalFields": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Amount": "10000",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"FinishAfter": 557020800,
"Flags": 0,
"OwnerNode": "0000000000000000",
"PreviousTxnID": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263",
"PreviousTxnLgrSeq": 1828796
},
"LedgerEntryType": "Escrow",
"LedgerIndex": "2B9845CB9DF686B9615BF04F3EC66095A334D985E03E71B893B90FCF6D4DC9E6"
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"Balance": "9999989980",
"Flags": 0,
"OwnerCount": 0,
"Sequence": 3
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "AE5AB6584A76C37C7382B6880609FC7792D90CDA36FF362AF412EB914C1715D3",
"PreviousFields": {
"Balance": "9999989990",
"OwnerCount": 1,
"Sequence": 2
},
"PreviousTxnID": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263",
"PreviousTxnLgrSeq": 1828796
}
},
{
"ModifiedNode": {
"FinalFields": {
"Flags": 0,
"Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"RootIndex": "D623EBEEEE701D4323D0ADA5320AF35EA8CC6520EBBEF69343354CD593DABC88"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "D623EBEEEE701D4323D0ADA5320AF35EA8CC6520EBBEF69343354CD593DABC88"
}
}
],
"TransactionIndex": 2,
"TransactionResult": "tesSUCCESS"
},
"validated": true
}
}
</code></pre></div>
</div>
<h2 id="send-a-conditionally-held-escrow">Send a conditionally-held escrow</h2> <h2 id="send-a-conditionally-held-escrow">Send a conditionally-held escrow</h2>
<h3 id="1-generate-condition-and-fulfillment">1. Generate condition and fulfillment</h3> <h3 id="1-generate-condition-and-fulfillment">1. Generate condition and fulfillment</h3>
<p>XRP Ledger escrows require PREIMGE-SHA-256 <a href="https://tools.ietf.org/html/draft-thomas-crypto-conditions-03">Crypto-Conditions</a>. To calculate a condition and fulfillment in the proper format, you should use a Crypto-Conditions library such as <a href="https://github.com/interledgerjs/five-bells-condition">five-bells-condition</a>. For fulfillments, Ripple recommends using one of the following methods to generate the fulfillment:</p> <p>XRP Ledger escrows require PREIMGE-SHA-256 <a href="https://tools.ietf.org/html/draft-thomas-crypto-conditions-03">Crypto-Conditions</a>. To calculate a condition and fulfillment in the proper format, you should use a Crypto-Conditions library such as <a href="https://github.com/interledgerjs/five-bells-condition">five-bells-condition</a>. For fulfillments, Ripple recommends using one of the following methods to generate the fulfillment:</p>
@@ -300,16 +584,18 @@ console.log(myFulfillment.getConditionBinary().toString('hex'));
<h3 id="2-calculate-release-or-cancel-time">2. Calculate release or cancel time</h3> <h3 id="2-calculate-release-or-cancel-time">2. Calculate release or cancel time</h3>
<p>A Conditional <code>Escrow</code> transaction must contain either a <code>CancelAfter</code> or <code>FinishAfter</code> field, or both. The <code>CancelAfter</code> field lets the XRP revert to the sender if the condition is not fulfilled before the specified time. The <code>FinishAfter</code> field specifies a time before which the escrow cannot execute, even if someone sends the correct fulfillment. Whichever field you provide, the time it specifies must be in the future.</p> <p>A Conditional <code>Escrow</code> transaction must contain either a <code>CancelAfter</code> or <code>FinishAfter</code> field, or both. The <code>CancelAfter</code> field lets the XRP revert to the sender if the condition is not fulfilled before the specified time. The <code>FinishAfter</code> field specifies a time before which the escrow cannot execute, even if someone sends the correct fulfillment. Whichever field you provide, the time it specifies must be in the future.</p>
<p>Example for setting a <code>CancelAfter</code> time of 24 hours in the future:</p> <p>Example for setting a <code>CancelAfter</code> time of 24 hours in the future:</p>
<div class="multicode" id="code-2"><ul class="codetabs"><li><a href="#code-2-0">JavaScript</a></li><li><a href="#code-2-1">Python 2/3</a></li></ul> <div class="multicode" id="code-11"><ul class="codetabs"><li><a href="#code-11-0">JavaScript</a></li><li><a href="#code-11-1">Python 2/3</a></li></ul>
<div class="code_sample" id="code-2-0" style="position: static;"><pre><code class="js">const rippleOffset = 946684800; <div class="code_sample" id="code-11-0" style="position: static;"><pre><code class="js">const rippleOffset = 946684800;
const CancelAfter = Math.floor(Date.now() / 1000) + (24*60*60) - rippleOffset; const CancelAfter = Math.floor(Date.now() / 1000) + (24*60*60) - rippleOffset;
console.log(CancelAfter);
// Example: 556927412 // Example: 556927412
</code></pre></div> </code></pre></div>
<div class="code_sample" id="code-2-1" style="position: static;"><pre><code class="python">from time import time <div class="code_sample" id="code-11-1" style="position: static;"><pre><code class="python">from time import time
ripple_offset = 946684800 ripple_offset = 946684800
cancel_after = int(time()) + (24*60*60) - 946684800 cancel_after = int(time()) + (24*60*60) - 946684800
print(cancel_after)
# Example: 556927412 # Example: 556927412
</code></pre></div> </code></pre></div>
</div> </div>
@@ -318,9 +604,9 @@ cancel_after = int(time()) + (24*60*60) - 946684800
<p><a href="reference-transaction-format.html#signing-and-submitting-transactions">Sign and submit</a> an <a href="reference-transaction-format.html#escrowcreate">EscrowCreate transaction</a>. Set the <code>Condition</code> field of the transaction to the time when the held payment should be released. Set the <code>Destination</code> to the recipient, which can be the same address as the sender. Include the <code>CancelAfter</code> or <code>FinishAfter</code> time you calculated in the previous step.</p> <p><a href="reference-transaction-format.html#signing-and-submitting-transactions">Sign and submit</a> an <a href="reference-transaction-format.html#escrowcreate">EscrowCreate transaction</a>. Set the <code>Condition</code> field of the transaction to the time when the held payment should be released. Set the <code>Destination</code> to the recipient, which can be the same address as the sender. Include the <code>CancelAfter</code> or <code>FinishAfter</code> time you calculated in the previous step.</p>
<p class="devportal-callout caution"><strong>Caution:</strong> Never submit a secret key to a server you do not control. Do not send a secret key unencrypted over the network.</p> <p class="devportal-callout caution"><strong>Caution:</strong> Never submit a secret key to a server you do not control. Do not send a secret key unencrypted over the network.</p>
<p>Request:</p> <p>Request:</p>
<div class="multicode" id="code-3"><ul class="codetabs"><li><a href="#code-3-0">Websocket</a></li></ul> <div class="multicode" id="code-12"><ul class="codetabs"><li><a href="#code-12-0">Websocket</a></li></ul>
<div class="code_sample" id="code-3-0" style="position: static;"><pre><code class="json">{ <div class="code_sample" id="code-12-0" style="position: static;"><pre><code class="json">{
"command": "submit", "command": "submit",
"secret": "s████████████████████████████", "secret": "s████████████████████████████",
"tx_json": { "tx_json": {
@@ -335,9 +621,9 @@ cancel_after = int(time()) + (24*60*60) - 946684800
</code></pre></div> </code></pre></div>
</div> </div>
<p>Response:</p> <p>Response:</p>
<div class="multicode" id="code-4"><ul class="codetabs"><li><a href="#code-4-0">Websocket</a></li></ul> <div class="multicode" id="code-13"><ul class="codetabs"><li><a href="#code-13-0">Websocket</a></li></ul>
<div class="code_sample" id="code-4-0" style="position: static;"><pre><code class="json">{ <div class="code_sample" id="code-13-0" style="position: static;"><pre><code class="json">{
"id": 1, "id": 1,
"status": "success", "status": "success",
"type": "response", "type": "response",
@@ -366,32 +652,22 @@ cancel_after = int(time()) + (24*60*60) - 946684800
</div> </div>
<h3 id="4-wait-for-validation">4. Wait for validation</h3> <h3 id="4-wait-for-validation">4. Wait for validation</h3>
<p>On the live network or the Ripple Test Net, you can wait 4-7 seconds for the ledger to close automatically.</p> <p>On the live network or the Ripple Test Net, you can wait 4-7 seconds for the ledger to close automatically.</p>
<p>If you're running <code>rippled</code> in stand-alone mode, use the <a href="reference-rippled.html#ledger-accept"><code>ledger_accept</code> command</a> to manually close the ledger:</p> <p>If you're running <code>rippled</code> in stand-alone mode, use the <a href="reference-rippled.html#ledger-accept"><code>ledger_accept</code> command</a> to manually close the ledger.</p>
<pre><code>$ rippled ledger_accept
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
"ledger_current_index" : 7,
"status" : "success"
}
}
</code></pre>
<h3 id="5-confirm-that-the-escrow-was-created">5. Confirm that the escrow was created</h3> <h3 id="5-confirm-that-the-escrow-was-created">5. Confirm that the escrow was created</h3>
<p>Use the <a href="reference-rippled.html#tx"><code>tx</code> command</a> with the transaction's identifying hash to check its final status. In particular, look for a <code>CreatedNode</code> in the transaction metadata to indicate that it created an <a href="reference-ledger-format.html#escrow">Escrow ledger object</a>.</p> <p>Use the <a href="reference-rippled.html#tx"><code>tx</code> command</a> with the transaction's identifying hash to check its final status. In particular, look for a <code>CreatedNode</code> in the transaction metadata to indicate that it created an <a href="reference-ledger-format.html#escrow">Escrow ledger object</a>.</p>
<p>Request:</p> <p>Request:</p>
<div class="multicode" id="code-5"><ul class="codetabs"><li><a href="#code-5-0">Websocket</a></li></ul> <div class="multicode" id="code-14"><ul class="codetabs"><li><a href="#code-14-0">Websocket</a></li></ul>
<div class="code_sample" id="code-5-0" style="position: static;"><pre><code class="json">{ <div class="code_sample" id="code-14-0" style="position: static;"><pre><code class="json">{
"command": "tx", "command": "tx",
"transaction": "E22D1F6EB006CAD35E0DBD3B4F3748427055E4C143EBE95AA6603823AEEAD324" "transaction": "E22D1F6EB006CAD35E0DBD3B4F3748427055E4C143EBE95AA6603823AEEAD324"
} }
</code></pre></div> </code></pre></div>
</div> </div>
<p>Response:</p> <p>Response:</p>
<div class="multicode" id="code-6"><ul class="codetabs"><li><a href="#code-6-0">Websocket</a></li></ul> <div class="multicode" id="code-15"><ul class="codetabs"><li><a href="#code-15-0">Websocket</a></li></ul>
<div class="code_sample" id="code-6-0" style="position: static;"><pre><code class="json">{ <div class="code_sample" id="code-15-0" style="position: static;"><pre><code class="json">{
"id": 3, "id": 3,
"status": "success", "status": "success",
"type": "response", "type": "response",
@@ -475,15 +751,15 @@ Connecting to 127.0.0.1:5005
</code></pre></div> </code></pre></div>
</div> </div>
<h3 id="6-submit-escrowfinish-transaction-1">6. Submit EscrowFinish transaction</h3> <h3 id="6-submit-escrowfinish-transaction-1">6. Submit EscrowFinish transaction</h3>
<p><a href="reference-transaction-format.html#signing-and-submitting-transactions">Sign and submit</a> an <a href="reference-transaction-format.html#escrowcreate">EscrowCreate transaction</a> to execute the release of the funds after the <code>FinishAfter</code> time has passed. Set the <code>Owner</code> field of the transaction to the <code>Account</code> address from the EscrowCreate transaction, and the <code>OfferSequence</code> to the <code>Sequence</code> number from the EscrowCreate transaction. Set the <code>Condition</code> and <code>Fulfillment</code> fields to the condition and fulfillment values, in hexadecimal, that you generated in step 1.</p> <p><a href="reference-transaction-format.html#signing-and-submitting-transactions">Sign and submit</a> an <a href="reference-transaction-format.html#escrowcreate">EscrowCreate transaction</a> to execute the release of the funds after the <code>FinishAfter</code> time has passed. Set the <code>Owner</code> field of the transaction to the <code>Account</code> address from the EscrowCreate transaction, and the <code>OfferSequence</code> to the <code>Sequence</code> number from the EscrowCreate transaction. Set the <code>Condition</code> and <code>Fulfillment</code> fields to the condition and fulfillment values, in hexadecimal, that you generated in step 1. Set the <code>Fee</code> (<a href="concept-transaction-cost.html">transaction cost</a>) value based on the size of the fulfillment in bytes: a conditional EscrowFinish requires at least 330 drops of XRP plus 10 drops per 16 bytes in the size of the fulfillment.</p>
<p class="devportal-callout note"><strong>Note:</strong> If you included a <code>FinishAfter</code> field in the EscrowCreate transaction, you cannot execute it before that time has passed, even if you provide the correct fulfillment for the Escrow's condition. The EscrowFinish transaction fails with the <a href="reference-transactions.html#transaction-results">result code</a> <code>tecNO_PERMISSION</code> if the previously-closed ledger's close time is before the <code>FinishAfter</code> time.</p> <p class="devportal-callout note"><strong>Note:</strong> If you included a <code>FinishAfter</code> field in the EscrowCreate transaction, you cannot execute it before that time has passed, even if you provide the correct fulfillment for the Escrow's condition. The EscrowFinish transaction fails with the <a href="reference-transactions.html#transaction-results">result code</a> <code>tecNO_PERMISSION</code> if the previously-closed ledger's close time is before the <code>FinishAfter</code> time.</p>
<p class="devportal-callout caution"><strong>Caution:</strong> Never submit a secret key to a server you do not control. Do not send a secret key unencrypted over the network.</p> <p class="devportal-callout caution"><strong>Caution:</strong> Never submit a secret key to a server you do not control. Do not send a secret key unencrypted over the network.</p>
<div class="multicode" id="code-7"><ul class="codetabs"><li><a href="#code-7-0">Websocket</a></li></ul> <div class="multicode" id="code-16"><ul class="codetabs"><li><a href="#code-16-0">Websocket</a></li></ul>
<div class="code_sample" id="code-7-0" style="position: static;"><pre><code class="json">{ <div class="code_sample" id="code-16-0" style="position: static;"><pre><code class="json">{
"command": "submit", "command": "submit",
"secret": "s████████████████████████████", "secret": "s████████████████████████████",
"tx_json": { "tx_json": {
"Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB", "Account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
"TransactionType": "EscrowFinish", "TransactionType": "EscrowFinish",
"Owner": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB", "Owner": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
@@ -496,9 +772,9 @@ Connecting to 127.0.0.1:5005
</code></pre></div> </code></pre></div>
</div> </div>
<p>Response:</p> <p>Response:</p>
<div class="multicode" id="code-8"><ul class="codetabs"><li><a href="#code-8-0">Websocket</a></li></ul> <div class="multicode" id="code-17"><ul class="codetabs"><li><a href="#code-17-0">Websocket</a></li></ul>
<div class="code_sample" id="code-8-0" style="position: static;"><pre><code class="json">{ <div class="code_sample" id="code-17-0" style="position: static;"><pre><code class="json">{
"id": 4, "id": 4,
"status": "success", "status": "success",
"type": "response", "type": "response",
@@ -528,17 +804,7 @@ Connecting to 127.0.0.1:5005
<p>Take note of the transaction's identifying <code>hash</code> value so you can easily check its final status when it is included in a validated ledger version.</p> <p>Take note of the transaction's identifying <code>hash</code> value so you can easily check its final status when it is included in a validated ledger version.</p>
<h3 id="7-wait-for-validation-1">7. Wait for validation</h3> <h3 id="7-wait-for-validation-1">7. Wait for validation</h3>
<p>On the live network or the Ripple Test Net, you can wait 4-7 seconds for the ledger to close automatically.</p> <p>On the live network or the Ripple Test Net, you can wait 4-7 seconds for the ledger to close automatically.</p>
<p>If you're running <code>rippled</code> in stand-alone mode, use the <a href="reference-rippled.html#ledger-accept"><code>ledger_accept</code> command</a> to manually close the ledger:</p> <p>If you're running <code>rippled</code> in stand-alone mode, use the <a href="reference-rippled.html#ledger-accept"><code>ledger_accept</code> command</a> to manually close the ledger.</p>
<pre><code>$ rippled ledger_accept
Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005
{
"result" : {
"ledger_current_index" : 8,
"status" : "success"
}
}
</code></pre>
<h3 id="8-confirm-final-result-1">8. Confirm final result</h3> <h3 id="8-confirm-final-result-1">8. Confirm final result</h3>
<p>Use the <a href="reference-rippled.html#tx"><code>tx</code> command</a> with the EscrowFinish transaction's identifying hash to check its final status. In particular, look in the transaction metadata for a <code>ModifiedNode</code> of type <code>AccountRoot</code> for the destination of the escrowed payment. The <code>FinalFields</code> of the object should reflect the increase in XRP in the <code>Balance</code> field.</p> <p>Use the <a href="reference-rippled.html#tx"><code>tx</code> command</a> with the EscrowFinish transaction's identifying hash to check its final status. In particular, look in the transaction metadata for a <code>ModifiedNode</code> of type <code>AccountRoot</code> for the destination of the escrowed payment. The <code>FinalFields</code> of the object should reflect the increase in XRP in the <code>Balance</code> field.</p>
<p>Request:</p> <p>Request:</p>
@@ -645,12 +911,12 @@ Connecting to 127.0.0.1:5005
} }
} }
</code></pre> </code></pre>
<h2 id="look-up-escrows-where-you-are-the-sender">Look up escrows where you are the sender</h2> <h2 id="look-up-escrows-by-sender">Look up escrows by sender</h2>
<p>All pending escrows are stored in the ledger as <a href="reference-ledger-format.html#escrow">Escrow objects</a>. You can look up escrow nodes owned by your address using the <a href="reference-rippled.html#account-objects"><code>account_objects</code> method</a>.</p> <p>All pending escrows are stored in the ledger as <a href="reference-ledger-format.html#escrow">Escrow objects</a>. You can look up escrow nodes owned by your address using the <a href="reference-rippled.html#account-objects"><code>account_objects</code> method</a>.</p>
<p>Request:</p> <p>Request:</p>
<div class="multicode" id="code-9"><ul class="codetabs"><li><a href="#code-9-0">Websocket</a></li></ul> <div class="multicode" id="code-18"><ul class="codetabs"><li><a href="#code-18-0">Websocket</a></li></ul>
<div class="code_sample" id="code-9-0" style="position: static;"><pre><code class="json">{ <div class="code_sample" id="code-18-0" style="position: static;"><pre><code class="json">{
"id": 5, "id": 5,
"command": "account_objects", "command": "account_objects",
"account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB", "account": "rEhw9vD98ZrkY4tZPvkZst5H18RysqFdaB",
@@ -660,9 +926,9 @@ Connecting to 127.0.0.1:5005
</code></pre></div> </code></pre></div>
</div> </div>
<p>Response:</p> <p>Response:</p>
<div class="multicode" id="code-10"><ul class="codetabs"><li><a href="#code-10-0">Websocket</a></li></ul> <div class="multicode" id="code-19"><ul class="codetabs"><li><a href="#code-19-0">Websocket</a></li></ul>
<div class="code_sample" id="code-10-0" style="position: static;"><pre><code class="json">{ <div class="code_sample" id="code-19-0" style="position: static;"><pre><code class="json">{
"id": 5, "id": 5,
"status": "success", "status": "success",
"type": "response", "type": "response",