diff --git a/README.md b/README.md index 5cec660..ee7d9fd 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ stateDiagram-v2 | Function | Description | |---|---| -| `__constructor` | Open a channel with an initial deposit. Callable by the funder, or anyone if amount is zero. | +| `__constructor` | Open a channel with an initial deposit. Callable by the deployer, authorized by the funder. | | `top_up` | Deposit additional tokens into the channel. | | `settle` | Withdraw funds using a signed commitment without closing the channel. | | `close` | Close the channel using a signed commitment, withdrawing funds to the recipient. Automatically attempts to refund the funder. | diff --git a/contracts/channel-factory/src/lib.rs b/contracts/channel-factory/src/lib.rs index ef84bad..783e327 100644 --- a/contracts/channel-factory/src/lib.rs +++ b/contracts/channel-factory/src/lib.rs @@ -80,16 +80,14 @@ impl FactoryContract { /// Deploy a new channel. /// - /// Callable by anyone. + /// Callable by anyone, authorized by the funder (from). /// /// # Auth - /// - `from`: required if amount > 0. + /// - `from`: required. pub fn open(env: &Env, salt: BytesN<32>, token: Address, from: Address, commitment_key: BytesN<32>, to: Address, amount: i128, refund_waiting_period: u32) -> Address { - if amount > 0 { - // Authorize the funder at the factory level so that the channel - // constructor's top_up does not require non-root authorization. - from.require_auth(); - } + // Authorize the funder at the factory level so that the channel + // constructor's top_up does not require non-root authorization. + from.require_auth(); // Deploy the channel contract using the stored wasm hash. let wasm_hash = Self::wasm_hash(env); diff --git a/contracts/channel-factory/src/test.rs b/contracts/channel-factory/src/test.rs index 8832370..1bffb9e 100644 --- a/contracts/channel-factory/src/test.rs +++ b/contracts/channel-factory/src/test.rs @@ -2,10 +2,10 @@ use ed25519_dalek::SigningKey; use soroban_sdk::{ - testutils::Address as _, + testutils::{Address as _, AuthorizedFunction, AuthorizedInvocation}, token::{StellarAssetClient, TokenClient}, xdr::ToXdr, - Address, BytesN, Env, + Address, BytesN, Env, IntoVal, Symbol, }; use crate::{DeploymentSaltPreimage, FactoryContract, FactoryContractClient}; @@ -59,3 +59,55 @@ fn test_open() { assert_eq!(token.balance(&channel_id), 500); assert_eq!(token.balance(&funder), 500); } + +/// Opening a channel with amount 0 still requires the funder's auth. +#[test] +fn test_open_zero_amount() { + let env = Env::default(); + env.mock_all_auths(); + + let admin = Address::generate(&env); + let wasm_hash = env.deployer().upload_contract_wasm(channel_contract::WASM); + + // Deploy the factory. + let factory_id = env.register(FactoryContract, (&admin, &wasm_hash)); + let factory_client = FactoryContractClient::new(&env, &factory_id); + + // Set up a channel. + let auth_key = SigningKey::from_bytes(&[2u8; 32]); + let auth_pubkey = BytesN::from_array(&env, &auth_key.verifying_key().to_bytes()); + let funder = Address::generate(&env); + let to = Address::generate(&env); + + let (token_addr, token, asset_admin) = create_token(&env); + asset_admin.mint(&funder, &1000); + + // Deploy a channel via the factory with no initial deposit. + let salt = BytesN::from_array(&env, &[0u8; 32]); + let channel_id = factory_client.open(&salt, &token_addr, &funder, &auth_pubkey, &to, &0i128, &100u32); + + assert_eq!( + env.auths(), + [( + funder.clone(), + AuthorizedInvocation { + function: AuthorizedFunction::Contract(( + factory_id.clone(), + Symbol::new(&env, "open"), + (salt.clone(), token_addr.clone(), funder.clone(), auth_pubkey.clone(), to.clone(), 0i128, 100u32).into_val(&env), + )), + sub_invocations: [AuthorizedInvocation { + function: AuthorizedFunction::Contract(( + channel_id.clone(), + Symbol::new(&env, "__constructor"), + (token_addr.clone(), funder.clone(), auth_pubkey.clone(), to.clone(), 0i128, 100u32).into_val(&env), + )), + sub_invocations: [].into(), + }] + .into(), + } + )] + ); + assert_eq!(token.balance(&channel_id), 0); + assert_eq!(token.balance(&funder), 1000); +} diff --git a/contracts/channel-factory/test_snapshots/test/test_open.1.json b/contracts/channel-factory/test_snapshots/test/test_open.1.json index 5a5deaa..d03c6a0 100644 --- a/contracts/channel-factory/test_snapshots/test/test_open.1.json +++ b/contracts/channel-factory/test_snapshots/test/test_open.1.json @@ -225,7 +225,7 @@ ] }, "val": { - "bytes": "1274b4978b9889ba8ac3873e8a5fa9c2b25ec899c2964397580d89ac5393b874" + "bytes": "4af52db3dba04b190ddd42cc27ae37b3835e399be842639f8e618f1838bcdcf0" } } ] @@ -496,7 +496,7 @@ "val": { "contract_instance": { "executable": { - "wasm": "1274b4978b9889ba8ac3873e8a5fa9c2b25ec899c2964397580d89ac5393b874" + "wasm": "4af52db3dba04b190ddd42cc27ae37b3835e399be842639f8e618f1838bcdcf0" }, "storage": [ { @@ -591,8 +591,8 @@ } } }, - "hash": "1274b4978b9889ba8ac3873e8a5fa9c2b25ec899c2964397580d89ac5393b874", - "code": "0061736d01000000016f136000017e60017e017e60027e7e017e60037e7e7e017e60017f017e60027f7e0060027e7e0060037f7e7e0060017f0060027f7f006000017f60057e7e7e7e7e0060027f7f017e60017e017f60037f7f7f0060047f7f7f7f017e60000060067e7e7e7e7e7e017e60047e7e7e7f017e0279140164015f00030162015f00010163013000030161013000010178013700000178013100020178013600000164013000030176016700020169013800010169013700010169013600020162016a0002017801330000016201380001016c01310002016c01300002017801350001016c015f0003016d013900030331300b020c040d0109050609060e04040f0303040705050a08061008070805110002050a000000010000020000010012070405030100110621047f01418080c0000b7f0041cc82c0000b7f0041cc82c0000b7f0041d082c0000b07cd0112066d656d6f727902000d5f5f636f6e7374727563746f7200310762616c616e6365003205636c6f736500330b636c6f73655f73746172740036096465706f736974656400370466726f6d003812707265706172655f636f6d6d69746d656e74003906726566756e64003a15726566756e645f77616974696e675f706572696f64003b06736574746c65003c02746f003d05746f6b656e003e06746f705f7570003f0977697468647261776e0040015f03010a5f5f646174615f656e6403020b5f5f686561705f6261736503030c01010afd1c309f0101027f230041306b2206240020062003200410153703102006200237030820062001370300034020054118460440024041002105034020054118470440200641186a20056a200520066a290300370300200541086a21050c010b0b2000428eeeea95beb6def300200641186a41031016100042ff01834202520d00200641306a24000f0b05200641186a20056a4202370300200541086a21050c010b0b000b2d01017f230041106b22022400200220002001102620022802004101460440000b2002290308200241106a24000b16002000ad4220864204842001ad42208642048410080bee0102017f017e230041106b2201240002400240024002400240024002400240200041ff017141016b0e06010203040506000b200141c881c0004105101f0c060b200141cd81c0004104101f0c050b200141d181c000410d101f0c040b200141de81c0004102101f0c030b200141e081c0004113101f0c020b200141f381c000410f101f0c010b2001418282c0004116101f0b0240200128020045044020012903082102230041106b2200240020002002370308200041086a4101101621022001420037030020012002370308200041106a2400200129030821022001290300500d010b000b200141106a240020020b0b002000420210104201510b080020004202100f0b4202017e017f02402001101722021018047f20021019220242ff01834204520d012002422088a7210341010541000b210120002003360204200020013602000f0b000b0a00200010172001101c0b0b0020002001420210121a0b1100200010172001ad422086420484101c0b0e0041051017200020011015101c0bc40102037f017e027e0240200241094b0d00200221042001210503402006420886420e842004450d021a027f410120052d0000220341df00460d001a0240200341306b41ff0171410a4f0440200341c1006b41ff0171411a490d01200341e1006b41ff0171411a4f0d042003413b6b0c020b2003412e6b0c010b200341356b0bad42ff01832006420686842106200441016b2104200541016a21050c000b000b2001ad4220864204842002ad422086420484100c0b210620004200370300200020063703080b4f02017f027e230041106b220124002001200029030022033703004202210241012100034020000440200041016b2100200321020c010b0b20012002370308200141086a41011016200141106a24000b3402017f017e230041106b2201240020012000ad422086420484370308418481c0004101200141086a41011022200141106a24000b280020012003470440000b2000ad4220864204842002ad4220864204842001ad42208642048410130b0f00200020012002419881c00010410b0f0020002001200241b081c00010410b6a02017f017e230041306b22012400200141206a20002903002000290308102620012802204101460440000b2001200129032837030020012000290318370318200120002903103703102001200029032037030841ac82c00041042001410410221001200141306a24000b47002001423f8720028542005220014280808080808080407d42ffffffffffffffff005672047e20022001100b052001420886420b840b210120004200370300200020013703080b4602017f017e230041106b22022400024041021017220310180440200220031019102820022802004101470d01000b000b200229030820001025200110021a200241106a24000b0f00200020014280808080800410420b2f01027f230041106b22002400200041086a4104101a2000280208410171450440000b200028020c200041106a24000b3501027f230041106b22012400200141086a4106101a200128020c21022000200128020836020020002002360204200141106a24000b3101017e2001420059044020002001845045044041011043220210031a41001043200210042000200110140b0f0b102c000b0b0042838080801010111a0b0c002000410010431004102e0b5601017f230041206b220324002003200237030020032001428ed4e8d999b69e012003410110161000103020032802004101460440000b200329031021012000200329031837030820002001370300200341206a24000b5302017f027e230041206b22012400024020004105101722021018047e200120021019103020012802004101460d012001290318210320012903100542000b37030020002003370308200141206a24000f0b000b6d02017f017e2000027e024002402001a741ff0171220241c5004704402002410b470d0220002001423f87370318200020014208873703100c010b2001100921032001100a210120002003370318200020013703100b42000c010b20004283908080800137030842010b3703000b830202017f027e230041306b2206240002400240200042ff018342cd0052200142ff018342cd0052720d002006200210282006280200410146200342ff018342cd0052720d00200629030821022006200410302006280200410146200542ff0183420452720d00200629031822044200530d012006290310210741002000101b41012001101b410210172002101c41032003101b41042005422088a7101d20072004102b41e880c000102020072004101521042006200037032820062003370320200620054284808080708337031820062001370310200620023703082006200437030041b480c000410620064106102210051a200641306a240042020f0b000b102c000b2602017f017e230041106b220024002000102d200029030020002903081015200041106a24000ba30402027f047e230041f0006b22022400200241106a2203200010300240024002400240024020022802104101460d00200229032821002002290320210520032001103420022802104101460d0020004200530d012002290318210141031043220610031a100421041006210720022004370330200220073703282002428ef2b299bab6b6d10037032020022005370310200220003703182003200110272003102f200020022903182201852000200020017d20052002290310220454ad7d220185834200530d02200520047d220442005220014200552001501b0d030c040b000b102c000b000b20052000101e410010431004200620042001101441c081c0001020200420012006102410051a0b10352103200241086a102a024020022802084101710440200228020c20034d0d010b41062003101d419081c00010202003102110051a0b410110432101200241406b4100104322061004102e02402002290340220550200229034822004200532000501b0d0010042104200220052000101537036820022001370360200220043703584100210303402003411846044041002103034020034118470440200241106a20036a200241d8006a20036a290300370300200341086a21030c010b0b2006428eeeea95beb6def300200241106a41031016100742ff01834203510d0241a881c0001020200520002001102310051a05200241106a20036a4202370300200341086a21030c010b0b0b200241f0006a240042020b0f00200020014280808080800810420b0800100d422088a70b6f02037f017e230041106b22012400200141086a102a027e20012802084101710440200128020c21004283808080c000103520004f0d011a0b4101104310031a4106417f1029103522006a2202200020024b1b2200101d419081c00010202000102110051a42020b200141106a24000b6002017f047e230041106b220024002000102d20002903002102200029030821012000102f20012000290308220385427f8520012002200220002903007c220456ad200120037c7c220285834200530440000b200420021015200041106a24000b0600410110430b7902017f037e230041306b22012400200120001030024020012802004101470440200129031822004200530d01200129031021021004210310062104200120003703082001200237030020012003370320200120043703182001428ef2b299bab6b6d10037031020011025200141306a24000f0b000b102c000ba30102027f057e230041206b22002400200041086a102a0240200028020841017145044042838080802021020c010b200028020c21011035200149044042838080803021020c010b41011043220410031a200041106a4100104322061004102e420221022000290310220550200029031822034200532003501b0d0020061004200420052003101441a881c0001020200520032004102310051a0b200041206a240020020b0b001029ad4220864204840b8b0202017f047e230041306b2202240020022000103002400240024020022802004101460d00200229031821002002290310210420022001103420022802004101460d0020004200530d012002290308210141031043220510031a100421031006210620022003370320200220063703182002428ef2b299bab6b6d10037031020022004370300200220003703082002200110272002102f200020022903082201852000200020017d20042002290300220354ad7d220185834200530d02200420037d220342005220014200552001501b044020042000101e410010431004200520032001101441c081c0001020200320012005102410051a0b200241306a240042020f0b000b102c000b000b0600410310430b0600410010430b3401017f230041206b2201240020012000103020012802004101460440000b20012903102001290318102b200141206a240042020b2602017f017e230041106b220024002000102f200029030020002903081015200041106a24000b3401017f230041106b220424002000200110152100200420023703082004200037030020034102200441021022200441106a24000b3901017e420121030240200142ff018342c800520d002001100e428080808070832002520d0020002001370308420021030b200020033703000b5a02017f017e230041106b220124000240024020012000101722021018047e20021019220242ff018342cd00520d012001200237030842010542000b3703000c010b000b2001280200450440000b2001290308200141106a24000b0bd3020100418080c0000bc902616d6f756e74636f6d6d69746d656e745f6b657966726f6d726566756e645f77616974696e675f706572696f64746f746f6b656e0000100006000000060010000e000000140010000400000018001000150000002d001000020000002f00100005000000000000000eb35ad3000000006566666563746976655f61745f6c6564676572007000100013000000000000000e2a4ec728000000000010000600000014001000040000000ee9acafea0d000000001000060000002d001000020000000ebc79a76deef200546f6b656e46726f6d436f6d6d69746d656e744b6579546f526566756e6457616974696e67506572696f6457697468647261776e416d6f756e74436c6f736545666665637469766541744c65646765726368616e6e656c646f6d61696e6e6574776f726b000010000600000018011000070000001f01100006000000250110000700bf3b0e636f6e7472616374737065637630000000000000004152657475726e732074686520726563697069656e7420616464726573732e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e00000000000002746f0000000000000000000100000013000000040000000000000000000000054572726f7200000000000004000000000000000e4e65676174697665416d6f756e7400000000000100000000000000094e6f74436c6f73656400000000000002000000000000001d526566756e6457616974696e67506572696f644e6f74456c617073656400000000000003000000000000000d416c7265616479436c6f73656400000000000004000000000000003e52657475726e73207468652066756e64657220616464726573732e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e00000000000466726f6d000000000000000100000013000000000000031e436c6f736520746865206368616e6e656c207573696e672061207369676e656420636f6d6d69746d656e742c207769746864726177696e672066756e647320746f207468650a726563697069656e742e2054686520616d6f756e74206973207468652063756d756c617469766520746f74616c2074686520726563697069656e7420697320656e7469746c65640a746f2e204f6e6c792074686520646966666572656e6365206265747765656e2074686520616d6f756e7420616e6420776861742068617320616c7265616479206265656e0a77697468647261776e206973207472616e736665727265642e0a0a4166746572207472616e7366657272696e672c20746869732066756e6374696f6e206175746f6d61746963616c6c7920617474656d70747320746f20726566756e64207468650a72656d61696e696e672062616c616e636520746f207468652066756e646572207573696e6720607472795f7472616e73666572602e205468697320726566756e640a617474656d70742077696c6c2073696c656e746c792073756363656564206f72206661696c20776974686f757420616666656374696e6720746865207769746864726177616c2e0a496620746865206175746f6d6174696320726566756e64206661696c732c207468652066756e6465722063616e2063616c6c205b60436f6e74726163743a3a726566756e64605d0a746f207265636c61696d207468652072656d61696e696e672062616c616e63652e0a0a43616e2062652063616c6c6564206576656e20616674657220746865206368616e6e656c20697320636c6f7365642c20757020756e74696c207468652066756e6465720a63616c6c73205b60436f6e74726163743a3a726566756e64605d20616e64207468652062616c616e636520697320647261696e65642e0a0a43616c6c61626c652062792074686520726563697069656e742028746f292e0a0a2320417574680a2d2060746f603a2072657175697265642e0a2d20436f6d6d69746d656e74207369676e61747572652073657276657320617320636f6d6d69746d656e745f6b657920617574686f72697a6174696f6e2e000000000005636c6f7365000000000000020000000000000006616d6f756e7400000000000b000000000000000373696700000003ee0000004000000000000000000000003d52657475726e732074686520746f6b656e20616464726573732e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e00000000000005746f6b656e00000000000000000000010000001300000002000000000000000000000007446174614b65790000000007000000000000000000000005546f6b656e00000000000000000000000000000446726f6d00000000000000000000000d436f6d6d69746d656e744b6579000000000000000000000000000002546f0000000000000000000000000013526566756e6457616974696e67506572696f640000000000000000000000000f57697468647261776e416d6f756e7400000000000000000000000016436c6f736545666665637469766541744c65646765720000000000000000016d526566756e64207468652072656d61696e696e672062616c616e636520746f207468652066756e6465722061667465722074686520636c6f7365206973206566666563746976652e0a0a43616e2062652063616c6c6564206d756c7469706c652074696d65732e20546869732069732075736566756c206966207468652066756e646572206163636964656e74616c6c790a6465706f73697473206164646974696f6e616c2066756e647320616674657220636c6f73696e6720e2809420746865792063616e2063616c6c20726566756e640a616761696e20746f207265636c61696d20746865206164646974696f6e616c2062616c616e63652e0a0a43616c6c61626c65206279207468652066756e646572202866726f6d292c2061667465722074686520636c6f7365206566666563746976655f61745f6c6564676572206861730a6265656e20726561636865642e0a0a2320417574680a2d206066726f6d603a2072657175697265642e00000000000006726566756e6400000000000000000001000003e90000000200000003000000000000030c536574746c652066756e647320746f2074686520726563697069656e74207573696e672061207369676e656420636f6d6d69746d656e7420776974686f757420636c6f73696e670a746865206368616e6e656c2e2054686520616d6f756e74206973207468652063756d756c617469766520746f74616c2074686520726563697069656e742069730a656e7469746c656420746f2e204f6e6c792074686520646966666572656e6365206265747765656e2074686520616d6f756e7420616e6420776861742068617320616c72656164790a6265656e2077697468647261776e206973207472616e736665727265642e0a0a54686520726563697069656e7420646f6573206e6f74206e65656420746f20736574746c6520616674657220657665727920636f6d6d69746d656e742e20546865792063616e0a616363756d756c617465206d756c7469706c6520636f6d6d69746d656e747320616e6420736574746c65207573696e67206f6e6c7920746865206c61746573740a286869676865737420616d6f756e742920636f6d6d69746d656e742e0a0a496620616e206f6c64657220636f6d6d69746d656e7420776974682061206c6f77657220616d6f756e74206973207573656420616674657220612068696768657220616d6f756e740a68617320616c7265616479206265656e2077697468647261776e2c206e6f2066756e647320617265207472616e736665727265642e0a0a43616e2062652063616c6c6564206576656e20616674657220746865206368616e6e656c20697320636c6f7365642c20757020756e74696c207468652066756e6465720a63616c6c73205b60436f6e74726163743a3a726566756e64605d20616e64207468652062616c616e636520697320647261696e65642e0a0a43616c6c61626c652062792074686520726563697069656e742028746f292e0a0a2320417574680a2d2060746f603a2072657175697265642e0a2d20436f6d6d69746d656e74207369676e61747572652073657276657320617320636f6d6d69746d656e745f6b657920617574686f72697a6174696f6e2e00000006736574746c650000000000020000000000000006616d6f756e7400000000000b000000000000000373696700000003ee00000040000000000000000000000123546f7020757020746865206368616e6e656c206279207472616e7366657272696e672074686520616d6f756e74206f6620746865206368616e6e656c7320746f6b656e2066726f6d207468652066756e646572202866726f6d0a61646472657373292e0a0a4e6f74653a205468652066756e6465722063616e20616c736f20746f7020757020746865206368616e6e656c206279207472616e7366657272696e6720746f6b656e730a6469726563746c7920746f20746865206368616e6e656c20636f6e74726163742061646472657373206f757473696465206f6620746869732066756e6374696f6e2e0a0a43616c6c61626c652062792066756e646572202866726f6d292e0a0a2320417574680a2d206066726f6d603a2072657175697265642e0000000006746f705f75700000000000010000000000000006616d6f756e7400000000000b00000000000000000000008752657475726e73207468652062616c616e6365206f6620746865206368616e6e656c2e205468697320697320746865206465706f736974656420616d6f756e740a6d696e757320616e7920616d6f756e7420616c72656164792077697468647261776e2e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e000000000762616c616e63650000000000000000010000000b0000000100000000000000000000000a436f6d6d69746d656e740000000000040000000000000006616d6f756e7400000000000b00000000000000076368616e6e656c00000000130000000000000006646f6d61696e00000000001100000000000000076e6574776f726b00000003ee0000002000000000000000c452657475726e732074686520746f74616c20616d6f756e74206465706f736974656420696e746f20746865206368616e6e656c2e0a0a54686973206973207468652062616c616e636520706c75732074686520616d6f756e7420616c72656164792077697468647261776e2e20526566756e6465640a616d6f756e74732061726520636f6e73696465726564206e6f206c6f6e676572206465706f73697465642e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e000000096465706f736974656400000000000000000000010000000b000000000000007752657475726e732074686520746f74616c20616d6f756e7420616c72656164792077697468647261776e2062792074686520726563697069656e74207669610a60736574746c6560206f722060636c6f7365602e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e000000000977697468647261776e00000000000000000000010000000b000000000000019d426567696e20636c6f73696e6720746865206368616e6e656c2c2065666665637469766520616674657220612077616974696e6720706572696f642e205468650a726563697069656e742063616e207374696c6c20736574746c65206f7220636c6f736520647572696e6720616e64206166746572207468652077616974696e670a706572696f642e2041667465722074686520636c6f7365206973206566666563746976652c207468652066756e6465722063616e2063616c6c20726566756e6420746f0a7265636c61696d207468652072656d61696e696e672062616c616e63652e0a0a2a2a496d706f7274616e743a2a2a2054686520726563697069656e742073686f756c6420736574746c65206f7220636c6f7365207768656e657665722074686579207365650a61205b606576656e743a3a436c6f7365605d2c206265666f7265207468652066756e6465722063616c6c732060726566756e64602e0a0a43616c6c61626c65206279207468652066756e646572202866726f6d292e0a0a2320417574680a2d206066726f6d603a2072657175697265642e0000000000000b636c6f73655f7374617274000000000000000001000003e9000000020000000300000000000004004f70656e2061206368616e6e656c206279206465706f736974696e6720746f6b656e732066726f6d207468652066756e64657220746f2074686520636f6e74726163742e0a0a2d2060746f6b656e603a20546865205345502d343120746f6b656e207573656420666f72207061796d656e74732e0a2d206066726f6d603a205468652066756e6465722077686f206465706f7369747320746f6b656e7320696e746f20746865206368616e6e656c2e0a2d2060636f6d6d69746d656e745f6b6579603a205468652065643235353139207075626c6963206b6579207573656420746f2076657269667920636f6d6d69746d656e740a7369676e6174757265732e205365652060707265706172655f636f6d6d69746d656e746020666f722064657461696c73206f6e0a636f6d6d69746d656e74732e0a2d2060746f603a2054686520726563697069656e742077686f2063616e20736574746c65206f7220636c6f736520746865206368616e6e656c207573696e670a7369676e656420636f6d6d69746d656e74732e0a2d2060616d6f756e74603a2054686520696e697469616c206465706f73697420616d6f756e742e0a2d2060726566756e645f77616974696e675f706572696f64603a20546865206e756d626572206f66206c6564676572732074686520726563697069656e742068617320746f0a636c6f73652061667465722060636c6f73655f7374617274602069732063616c6c65642c206265666f72652060726566756e64600a6265636f6d657320617661696c61626c652e20546869732076616c75652073686f756c64206265206c6172676520656e6f75676820746f2067697665207468650a726563697069656e742074696d6520746f206f627365727665206120636c6f7365206576656e7420616e64207375626d6974206120636c6f73652c0a6f74686572776973652074686520726563697069656e74206d6179206e6f742061636365707420746865206368616e6e656c2e20486f77657665722c2069740a73686f756c64206e6f7420626520736f206c617267652074686174207468652066756e6465722063616e6e6f74207265636c61696d2066756e647320696e20610a74696d656c79206d616e6e65722e2053657474696e67207a65726f206f7220612076657279206c6f77206e756d62657220726573756c747320696e0a6e6561722d696d6d65646961746520726566756e64732c20776869636820697320616c6d6f7374206365727461696e6c79206e6f742075736566756c20666f720a656974686572207061727469636970616e742e0a0a43616c6c61626c6520627920746865206465706c6f7965722e0a0a2320417574680a2d206066726f6d603a20726571756972656420696620616d6f756e74203e20302e0000000d5f5f636f6e7374727563746f72000000000000060000000000000005746f6b656e00000000000013000000000000000466726f6d00000013000000000000000e636f6d6d69746d656e745f6b65790000000003ee000000200000000000000002746f0000000000130000000000000006616d6f756e7400000000000b0000000000000015726566756e645f77616974696e675f706572696f640000000000000400000000000000000000019e52657475726e7320746865205844522073657269616c697a6564206279746573206f66206120636f6d6d69746d656e7420666f722074686520676976656e20616d6f756e742e0a0a5468652072657475726e6564206279746573206d757374206265207369676e6564206279207468652065643235353139206b657920636f72726573706f6e64696e6720746f0a7468652060636f6d6d69746d656e745f6b6579602073746f72656420696e20746865206368616e6e656c2e2054686520726573756c74696e67207369676e61747572652c0a616c6f6e6720776974682074686520616d6f756e742c2063616e2062652070617373656420746f2060736574746c6560206f722060636c6f736560206279207468650a726563697069656e742e0a0a436f6d6d69746d656e747320617265207479706963616c6c79207072657061726564206f66662d636861696e2e20546869732066756e6374696f6e2069732070726f76696465640a6173206120636f6e76656e69656e63652e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e000000000012707265706172655f636f6d6d69746d656e740000000000010000000000000006616d6f756e7400000000000b000000010000000e000000000000005052657475726e732074686520726566756e642077616974696e6720706572696f6420696e206c6564676572732e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e00000015726566756e645f77616974696e675f706572696f640000000000000000000001000000040000000500000037456d6974746564207768656e20746865206368616e6e656c206973206f70656e6564207669612074686520636f6e7374727563746f722e0000000000000000044f70656e00000001000000046f70656e00000006000000315468652066756e6465722077686f206465706f736974656420746f6b656e7320696e746f20746865206368616e6e656c2e0000000000000466726f6d00000013000000000000003c5468652065643235353139207075626c6963206b6579207573656420746f2076657269667920636f6d6d69746d656e74207369676e6174757265732e0000000e636f6d6d69746d656e745f6b65790000000003ee00000020000000000000004554686520726563697069656e742077686f2063616e20736574746c65206f7220636c6f736520746865206368616e6e656c207573696e67206120636f6d6d69746d656e742e00000000000002746f0000000000130000000000000023546865205345502d343120746f6b656e207573656420666f72207061796d656e74732e0000000005746f6b656e00000000000013000000000000001b54686520696e697469616c206465706f73697420616d6f756e742e0000000006616d6f756e7400000000000b000000000000004d546865206e756d626572206f66206c656467657273207468652066756e6465722068617320746f2077616974206265666f726520726566756e6420616674657220636c6f73655f73746172742e00000000000015726566756e645f77616974696e675f706572696f6400000000000004000000000000000200000005000000f6456d6974746564207768656e206368616e6e656c20636c6f7365207374617274732c2065697468657220696d6d6564696174656c792076696120636c6f7365206f7220776974680a612077616974696e6720706572696f642076696120636c6f73655f73746172742e0a0a546865206566666563746976655f61745f6c6564676572206669656c6420696e64696361746573207768656e2074686520636c6f7365206973206566666563746976652e204966207468650a6669656c6420696e64696361746573207468652063757272656e74206c6564676572207468656e2074686520636c6f736520697320696d6d6564696174652e00000000000000000005436c6f73650000000000000100000005636c6f7365000000000000010000005f546865206c65646765722073657175656e6365206e756d6265722061742077686963682074686520636c6f7365206265636f6d65732065666665637469766520616e640a7468652066756e6465722063616e2063616c6c20726566756e642e00000000136566666563746976655f61745f6c656467657200000000040000000000000002000000050000003c456d6974746564207768656e207468652066756e646572207265636c61696d732072656d61696e696e672066756e64732076696120726566756e642e0000000000000006526566756e6400000000000100000006726566756e64000000000002000000235468652066756e6465722077686f2072656365697665642074686520726566756e642e000000000466726f6d00000013000000000000007454686520616d6f756e74207472616e7366657272656420746f207468652066756e6465722e20546869732069732074686520656e746972652072656d61696e696e670a62616c616e6365206f6620746865206368616e6e656c206174207468652074696d65206f662074686520726566756e642e00000006616d6f756e7400000000000b0000000000000002000000050000003e456d6974746564207768656e2074686520726563697069656e742072656365697665732066756e64732076696120736574746c65206f7220636c6f73652e00000000000000000008576974686472617700000001000000087769746864726177000000020000002554686520726563697069656e742077686f207265636569766564207468652066756e64732e00000000000002746f000000000013000000000000002854686520616d6f756e74207472616e7366657272656420746f2074686520726563697069656e742e00000006616d6f756e7400000000000b0000000000000002001e11636f6e7472616374656e766d6574617630000000000000001900000000006f0e636f6e74726163746d65746176300000000000000005727376657200000000000006312e39342e3100000000000000000008727373646b7665720000002f32352e332e3023646362656134343531336665623737333461663662366334616365643263346137613237313564300000530e636f6e74726163746d65746176300000000000000006636c6976657200000000002f32372e302e30233561376335666537363533306266343234383437376163383132666337353731343662393863633400" + "hash": "4af52db3dba04b190ddd42cc27ae37b3835e399be842639f8e618f1838bcdcf0", + "code": "0061736d01000000016f136000017e60017e017e60027e7e017e60037e7e7e017e60017f017e60027f7e0060027e7e0060037f7e7e0060017f0060027f7f006000017f60057e7e7e7e7e0060027f7f017e60017e017f60037f7f7f0060047f7f7f7f017e60000060067e7e7e7e7e7e017e60047e7e7e7f017e0279140164015f00030162015f00010163013000030161013000010178013700000178013100020178013600000164013000030176016700020169013800010169013700010169013600020162016a0002017801330000016201380001016c01310002016c01300002017801350001016c015f0003016d013900030331300b020c040d0109050609060e04040f0303040705050a08061008070805110002050a000000010000020000010012070405030100110621047f01418080c0000b7f0041cc82c0000b7f0041cc82c0000b7f0041d082c0000b07cd0112066d656d6f727902000d5f5f636f6e7374727563746f7200310762616c616e6365003205636c6f736500330b636c6f73655f73746172740036096465706f736974656400370466726f6d003812707265706172655f636f6d6d69746d656e74003906726566756e64003a15726566756e645f77616974696e675f706572696f64003b06736574746c65003c02746f003d05746f6b656e003e06746f705f7570003f0977697468647261776e0040015f03010a5f5f646174615f656e6403020b5f5f686561705f6261736503030c01010afd1c309f0101027f230041306b2206240020062003200410153703102006200237030820062001370300034020054118460440024041002105034020054118470440200641186a20056a200520066a290300370300200541086a21050c010b0b2000428eeeea95beb6def300200641186a41031016100042ff01834202520d00200641306a24000f0b05200641186a20056a4202370300200541086a21050c010b0b000b2d01017f230041106b22022400200220002001102620022802004101460440000b2002290308200241106a24000b16002000ad4220864204842001ad42208642048410080bee0102017f017e230041106b2201240002400240024002400240024002400240200041ff017141016b0e06010203040506000b200141c881c0004105101f0c060b200141cd81c0004104101f0c050b200141d181c000410d101f0c040b200141de81c0004102101f0c030b200141e081c0004113101f0c020b200141f381c000410f101f0c010b2001418282c0004116101f0b0240200128020045044020012903082102230041106b2200240020002002370308200041086a4101101621022001420037030020012002370308200041106a2400200129030821022001290300500d010b000b200141106a240020020b0b002000420210104201510b080020004202100f0b4202017e017f02402001101722021018047f20021019220242ff01834204520d012002422088a7210341010541000b210120002003360204200020013602000f0b000b0a00200010172001101c0b0b0020002001420210121a0b1100200010172001ad422086420484101c0b0e0041051017200020011015101c0bc40102037f017e027e0240200241094b0d00200221042001210503402006420886420e842004450d021a027f410120052d0000220341df00460d001a0240200341306b41ff0171410a4f0440200341c1006b41ff0171411a490d01200341e1006b41ff0171411a4f0d042003413b6b0c020b2003412e6b0c010b200341356b0bad42ff01832006420686842106200441016b2104200541016a21050c000b000b2001ad4220864204842002ad422086420484100c0b210620004200370300200020063703080b4f02017f027e230041106b220124002001200029030022033703004202210241012100034020000440200041016b2100200321020c010b0b20012002370308200141086a41011016200141106a24000b3402017f017e230041106b2201240020012000ad422086420484370308418481c0004101200141086a41011022200141106a24000b280020012003470440000b2000ad4220864204842002ad4220864204842001ad42208642048410130b0f00200020012002419881c00010410b0f0020002001200241b081c00010410b6a02017f017e230041306b22012400200141206a20002903002000290308102620012802204101460440000b2001200129032837030020012000290318370318200120002903103703102001200029032037030841ac82c00041042001410410221001200141306a24000b47002001423f8720028542005220014280808080808080407d42ffffffffffffffff005672047e20022001100b052001420886420b840b210120004200370300200020013703080b4602017f017e230041106b22022400024041021017220310180440200220031019102820022802004101470d01000b000b200229030820001025200110021a200241106a24000b0f00200020014280808080800410420b2f01027f230041106b22002400200041086a4104101a2000280208410171450440000b200028020c200041106a24000b3501027f230041106b22012400200141086a4106101a200128020c21022000200128020836020020002002360204200141106a24000b3101017e2001420059044041011043220210031a20002001845045044041001043200210042000200110140b0f0b102c000b0b0042838080801010111a0b0c002000410010431004102e0b5601017f230041206b220324002003200237030020032001428ed4e8d999b69e012003410110161000103020032802004101460440000b200329031021012000200329031837030820002001370300200341206a24000b5302017f027e230041206b22012400024020004105101722021018047e200120021019103020012802004101460d012001290318210320012903100542000b37030020002003370308200141206a24000f0b000b6d02017f017e2000027e024002402001a741ff0171220241c5004704402002410b470d0220002001423f87370318200020014208873703100c010b2001100921032001100a210120002003370318200020013703100b42000c010b20004283908080800137030842010b3703000b830202017f027e230041306b2206240002400240200042ff018342cd0052200142ff018342cd0052720d002006200210282006280200410146200342ff018342cd0052720d00200629030821022006200410302006280200410146200542ff0183420452720d00200629031822044200530d012006290310210741002000101b41012001101b410210172002101c41032003101b41042005422088a7101d20072004102b41e880c000102020072004101521042006200037032820062003370320200620054284808080708337031820062001370310200620023703082006200437030041b480c000410620064106102210051a200641306a240042020f0b000b102c000b2602017f017e230041106b220024002000102d200029030020002903081015200041106a24000ba30402027f047e230041f0006b22022400200241106a2203200010300240024002400240024020022802104101460d00200229032821002002290320210520032001103420022802104101460d0020004200530d012002290318210141031043220610031a100421041006210720022004370330200220073703282002428ef2b299bab6b6d10037032020022005370310200220003703182003200110272003102f200020022903182201852000200020017d20052002290310220454ad7d220185834200530d02200520047d220442005220014200552001501b0d030c040b000b102c000b000b20052000101e410010431004200620042001101441c081c0001020200420012006102410051a0b10352103200241086a102a024020022802084101710440200228020c20034d0d010b41062003101d419081c00010202003102110051a0b410110432101200241406b4100104322061004102e02402002290340220550200229034822004200532000501b0d0010042104200220052000101537036820022001370360200220043703584100210303402003411846044041002103034020034118470440200241106a20036a200241d8006a20036a290300370300200341086a21030c010b0b2006428eeeea95beb6def300200241106a41031016100742ff01834203510d0241a881c0001020200520002001102310051a05200241106a20036a4202370300200341086a21030c010b0b0b200241f0006a240042020b0f00200020014280808080800810420b0800100d422088a70b6f02037f017e230041106b22012400200141086a102a027e20012802084101710440200128020c21004283808080c000103520004f0d011a0b4101104310031a4106417f1029103522006a2202200020024b1b2200101d419081c00010202000102110051a42020b200141106a24000b6002017f047e230041106b220024002000102d20002903002102200029030821012000102f20012000290308220385427f8520012002200220002903007c220456ad200120037c7c220285834200530440000b200420021015200041106a24000b0600410110430b7902017f037e230041306b22012400200120001030024020012802004101470440200129031822004200530d01200129031021021004210310062104200120003703082001200237030020012003370320200120043703182001428ef2b299bab6b6d10037031020011025200141306a24000f0b000b102c000ba30102027f057e230041206b22002400200041086a102a0240200028020841017145044042838080802021020c010b200028020c21011035200149044042838080803021020c010b41011043220410031a200041106a4100104322061004102e420221022000290310220550200029031822034200532003501b0d0020061004200420052003101441a881c0001020200520032004102310051a0b200041206a240020020b0b001029ad4220864204840b8b0202017f047e230041306b2202240020022000103002400240024020022802004101460d00200229031821002002290310210420022001103420022802004101460d0020004200530d012002290308210141031043220510031a100421031006210620022003370320200220063703182002428ef2b299bab6b6d10037031020022004370300200220003703082002200110272002102f200020022903082201852000200020017d20042002290300220354ad7d220185834200530d02200420037d220342005220014200552001501b044020042000101e410010431004200520032001101441c081c0001020200320012005102410051a0b200241306a240042020f0b000b102c000b000b0600410310430b0600410010430b3401017f230041206b2201240020012000103020012802004101460440000b20012903102001290318102b200141206a240042020b2602017f017e230041106b220024002000102f200029030020002903081015200041106a24000b3401017f230041106b220424002000200110152100200420023703082004200037030020034102200441021022200441106a24000b3901017e420121030240200142ff018342c800520d002001100e428080808070832002520d0020002001370308420021030b200020033703000b5a02017f017e230041106b220124000240024020012000101722021018047e20021019220242ff018342cd00520d012001200237030842010542000b3703000c010b000b2001280200450440000b2001290308200141106a24000b0bd3020100418080c0000bc902616d6f756e74636f6d6d69746d656e745f6b657966726f6d726566756e645f77616974696e675f706572696f64746f746f6b656e0000100006000000060010000e000000140010000400000018001000150000002d001000020000002f00100005000000000000000eb35ad3000000006566666563746976655f61745f6c6564676572007000100013000000000000000e2a4ec728000000000010000600000014001000040000000ee9acafea0d000000001000060000002d001000020000000ebc79a76deef200546f6b656e46726f6d436f6d6d69746d656e744b6579546f526566756e6457616974696e67506572696f6457697468647261776e416d6f756e74436c6f736545666665637469766541744c65646765726368616e6e656c646f6d61696e6e6574776f726b000010000600000018011000070000001f01100006000000250110000700b33b0e636f6e7472616374737065637630000000000000004152657475726e732074686520726563697069656e7420616464726573732e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e00000000000002746f0000000000000000000100000013000000040000000000000000000000054572726f7200000000000004000000000000000e4e65676174697665416d6f756e7400000000000100000000000000094e6f74436c6f73656400000000000002000000000000001d526566756e6457616974696e67506572696f644e6f74456c617073656400000000000003000000000000000d416c7265616479436c6f73656400000000000004000000000000003e52657475726e73207468652066756e64657220616464726573732e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e00000000000466726f6d000000000000000100000013000000000000031e436c6f736520746865206368616e6e656c207573696e672061207369676e656420636f6d6d69746d656e742c207769746864726177696e672066756e647320746f207468650a726563697069656e742e2054686520616d6f756e74206973207468652063756d756c617469766520746f74616c2074686520726563697069656e7420697320656e7469746c65640a746f2e204f6e6c792074686520646966666572656e6365206265747765656e2074686520616d6f756e7420616e6420776861742068617320616c7265616479206265656e0a77697468647261776e206973207472616e736665727265642e0a0a4166746572207472616e7366657272696e672c20746869732066756e6374696f6e206175746f6d61746963616c6c7920617474656d70747320746f20726566756e64207468650a72656d61696e696e672062616c616e636520746f207468652066756e646572207573696e6720607472795f7472616e73666572602e205468697320726566756e640a617474656d70742077696c6c2073696c656e746c792073756363656564206f72206661696c20776974686f757420616666656374696e6720746865207769746864726177616c2e0a496620746865206175746f6d6174696320726566756e64206661696c732c207468652066756e6465722063616e2063616c6c205b60436f6e74726163743a3a726566756e64605d0a746f207265636c61696d207468652072656d61696e696e672062616c616e63652e0a0a43616e2062652063616c6c6564206576656e20616674657220746865206368616e6e656c20697320636c6f7365642c20757020756e74696c207468652066756e6465720a63616c6c73205b60436f6e74726163743a3a726566756e64605d20616e64207468652062616c616e636520697320647261696e65642e0a0a43616c6c61626c652062792074686520726563697069656e742028746f292e0a0a2320417574680a2d2060746f603a2072657175697265642e0a2d20436f6d6d69746d656e74207369676e61747572652073657276657320617320636f6d6d69746d656e745f6b657920617574686f72697a6174696f6e2e000000000005636c6f7365000000000000020000000000000006616d6f756e7400000000000b000000000000000373696700000003ee0000004000000000000000000000003d52657475726e732074686520746f6b656e20616464726573732e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e00000000000005746f6b656e00000000000000000000010000001300000002000000000000000000000007446174614b65790000000007000000000000000000000005546f6b656e00000000000000000000000000000446726f6d00000000000000000000000d436f6d6d69746d656e744b6579000000000000000000000000000002546f0000000000000000000000000013526566756e6457616974696e67506572696f640000000000000000000000000f57697468647261776e416d6f756e7400000000000000000000000016436c6f736545666665637469766541744c65646765720000000000000000016d526566756e64207468652072656d61696e696e672062616c616e636520746f207468652066756e6465722061667465722074686520636c6f7365206973206566666563746976652e0a0a43616e2062652063616c6c6564206d756c7469706c652074696d65732e20546869732069732075736566756c206966207468652066756e646572206163636964656e74616c6c790a6465706f73697473206164646974696f6e616c2066756e647320616674657220636c6f73696e6720e2809420746865792063616e2063616c6c20726566756e640a616761696e20746f207265636c61696d20746865206164646974696f6e616c2062616c616e63652e0a0a43616c6c61626c65206279207468652066756e646572202866726f6d292c2061667465722074686520636c6f7365206566666563746976655f61745f6c6564676572206861730a6265656e20726561636865642e0a0a2320417574680a2d206066726f6d603a2072657175697265642e00000000000006726566756e6400000000000000000001000003e90000000200000003000000000000030c536574746c652066756e647320746f2074686520726563697069656e74207573696e672061207369676e656420636f6d6d69746d656e7420776974686f757420636c6f73696e670a746865206368616e6e656c2e2054686520616d6f756e74206973207468652063756d756c617469766520746f74616c2074686520726563697069656e742069730a656e7469746c656420746f2e204f6e6c792074686520646966666572656e6365206265747765656e2074686520616d6f756e7420616e6420776861742068617320616c72656164790a6265656e2077697468647261776e206973207472616e736665727265642e0a0a54686520726563697069656e7420646f6573206e6f74206e65656420746f20736574746c6520616674657220657665727920636f6d6d69746d656e742e20546865792063616e0a616363756d756c617465206d756c7469706c6520636f6d6d69746d656e747320616e6420736574746c65207573696e67206f6e6c7920746865206c61746573740a286869676865737420616d6f756e742920636f6d6d69746d656e742e0a0a496620616e206f6c64657220636f6d6d69746d656e7420776974682061206c6f77657220616d6f756e74206973207573656420616674657220612068696768657220616d6f756e740a68617320616c7265616479206265656e2077697468647261776e2c206e6f2066756e647320617265207472616e736665727265642e0a0a43616e2062652063616c6c6564206576656e20616674657220746865206368616e6e656c20697320636c6f7365642c20757020756e74696c207468652066756e6465720a63616c6c73205b60436f6e74726163743a3a726566756e64605d20616e64207468652062616c616e636520697320647261696e65642e0a0a43616c6c61626c652062792074686520726563697069656e742028746f292e0a0a2320417574680a2d2060746f603a2072657175697265642e0a2d20436f6d6d69746d656e74207369676e61747572652073657276657320617320636f6d6d69746d656e745f6b657920617574686f72697a6174696f6e2e00000006736574746c650000000000020000000000000006616d6f756e7400000000000b000000000000000373696700000003ee00000040000000000000000000000123546f7020757020746865206368616e6e656c206279207472616e7366657272696e672074686520616d6f756e74206f6620746865206368616e6e656c7320746f6b656e2066726f6d207468652066756e646572202866726f6d0a61646472657373292e0a0a4e6f74653a205468652066756e6465722063616e20616c736f20746f7020757020746865206368616e6e656c206279207472616e7366657272696e6720746f6b656e730a6469726563746c7920746f20746865206368616e6e656c20636f6e74726163742061646472657373206f757473696465206f6620746869732066756e6374696f6e2e0a0a43616c6c61626c652062792066756e646572202866726f6d292e0a0a2320417574680a2d206066726f6d603a2072657175697265642e0000000006746f705f75700000000000010000000000000006616d6f756e7400000000000b00000000000000000000008752657475726e73207468652062616c616e6365206f6620746865206368616e6e656c2e205468697320697320746865206465706f736974656420616d6f756e740a6d696e757320616e7920616d6f756e7420616c72656164792077697468647261776e2e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e000000000762616c616e63650000000000000000010000000b0000000100000000000000000000000a436f6d6d69746d656e740000000000040000000000000006616d6f756e7400000000000b00000000000000076368616e6e656c00000000130000000000000006646f6d61696e00000000001100000000000000076e6574776f726b00000003ee0000002000000000000000c452657475726e732074686520746f74616c20616d6f756e74206465706f736974656420696e746f20746865206368616e6e656c2e0a0a54686973206973207468652062616c616e636520706c75732074686520616d6f756e7420616c72656164792077697468647261776e2e20526566756e6465640a616d6f756e74732061726520636f6e73696465726564206e6f206c6f6e676572206465706f73697465642e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e000000096465706f736974656400000000000000000000010000000b000000000000007752657475726e732074686520746f74616c20616d6f756e7420616c72656164792077697468647261776e2062792074686520726563697069656e74207669610a60736574746c6560206f722060636c6f7365602e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e000000000977697468647261776e00000000000000000000010000000b000000000000019d426567696e20636c6f73696e6720746865206368616e6e656c2c2065666665637469766520616674657220612077616974696e6720706572696f642e205468650a726563697069656e742063616e207374696c6c20736574746c65206f7220636c6f736520647572696e6720616e64206166746572207468652077616974696e670a706572696f642e2041667465722074686520636c6f7365206973206566666563746976652c207468652066756e6465722063616e2063616c6c20726566756e6420746f0a7265636c61696d207468652072656d61696e696e672062616c616e63652e0a0a2a2a496d706f7274616e743a2a2a2054686520726563697069656e742073686f756c6420736574746c65206f7220636c6f7365207768656e657665722074686579207365650a61205b606576656e743a3a436c6f7365605d2c206265666f7265207468652066756e6465722063616c6c732060726566756e64602e0a0a43616c6c61626c65206279207468652066756e646572202866726f6d292e0a0a2320417574680a2d206066726f6d603a2072657175697265642e0000000000000b636c6f73655f7374617274000000000000000001000003e9000000020000000300000000000003f24f70656e2061206368616e6e656c206279206465706f736974696e6720746f6b656e732066726f6d207468652066756e64657220746f2074686520636f6e74726163742e0a0a2d2060746f6b656e603a20546865205345502d343120746f6b656e207573656420666f72207061796d656e74732e0a2d206066726f6d603a205468652066756e6465722077686f206465706f7369747320746f6b656e7320696e746f20746865206368616e6e656c2e0a2d2060636f6d6d69746d656e745f6b6579603a205468652065643235353139207075626c6963206b6579207573656420746f2076657269667920636f6d6d69746d656e740a7369676e6174757265732e205365652060707265706172655f636f6d6d69746d656e746020666f722064657461696c73206f6e0a636f6d6d69746d656e74732e0a2d2060746f603a2054686520726563697069656e742077686f2063616e20736574746c65206f7220636c6f736520746865206368616e6e656c207573696e670a7369676e656420636f6d6d69746d656e74732e0a2d2060616d6f756e74603a2054686520696e697469616c206465706f73697420616d6f756e742e0a2d2060726566756e645f77616974696e675f706572696f64603a20546865206e756d626572206f66206c6564676572732074686520726563697069656e742068617320746f0a636c6f73652061667465722060636c6f73655f7374617274602069732063616c6c65642c206265666f72652060726566756e64600a6265636f6d657320617661696c61626c652e20546869732076616c75652073686f756c64206265206c6172676520656e6f75676820746f2067697665207468650a726563697069656e742074696d6520746f206f627365727665206120636c6f7365206576656e7420616e64207375626d6974206120636c6f73652c0a6f74686572776973652074686520726563697069656e74206d6179206e6f742061636365707420746865206368616e6e656c2e20486f77657665722c2069740a73686f756c64206e6f7420626520736f206c617267652074686174207468652066756e6465722063616e6e6f74207265636c61696d2066756e647320696e20610a74696d656c79206d616e6e65722e2053657474696e67207a65726f206f7220612076657279206c6f77206e756d62657220726573756c747320696e0a6e6561722d696d6d65646961746520726566756e64732c20776869636820697320616c6d6f7374206365727461696e6c79206e6f742075736566756c20666f720a656974686572207061727469636970616e742e0a0a43616c6c61626c6520627920746865206465706c6f7965722e0a0a2320417574680a2d206066726f6d603a2072657175697265642e00000000000d5f5f636f6e7374727563746f72000000000000060000000000000005746f6b656e00000000000013000000000000000466726f6d00000013000000000000000e636f6d6d69746d656e745f6b65790000000003ee000000200000000000000002746f0000000000130000000000000006616d6f756e7400000000000b0000000000000015726566756e645f77616974696e675f706572696f640000000000000400000000000000000000019e52657475726e7320746865205844522073657269616c697a6564206279746573206f66206120636f6d6d69746d656e7420666f722074686520676976656e20616d6f756e742e0a0a5468652072657475726e6564206279746573206d757374206265207369676e6564206279207468652065643235353139206b657920636f72726573706f6e64696e6720746f0a7468652060636f6d6d69746d656e745f6b6579602073746f72656420696e20746865206368616e6e656c2e2054686520726573756c74696e67207369676e61747572652c0a616c6f6e6720776974682074686520616d6f756e742c2063616e2062652070617373656420746f2060736574746c6560206f722060636c6f736560206279207468650a726563697069656e742e0a0a436f6d6d69746d656e747320617265207479706963616c6c79207072657061726564206f66662d636861696e2e20546869732066756e6374696f6e2069732070726f76696465640a6173206120636f6e76656e69656e63652e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e000000000012707265706172655f636f6d6d69746d656e740000000000010000000000000006616d6f756e7400000000000b000000010000000e000000000000005052657475726e732074686520726566756e642077616974696e6720706572696f6420696e206c6564676572732e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e00000015726566756e645f77616974696e675f706572696f640000000000000000000001000000040000000500000037456d6974746564207768656e20746865206368616e6e656c206973206f70656e6564207669612074686520636f6e7374727563746f722e0000000000000000044f70656e00000001000000046f70656e00000006000000315468652066756e6465722077686f206465706f736974656420746f6b656e7320696e746f20746865206368616e6e656c2e0000000000000466726f6d00000013000000000000003c5468652065643235353139207075626c6963206b6579207573656420746f2076657269667920636f6d6d69746d656e74207369676e6174757265732e0000000e636f6d6d69746d656e745f6b65790000000003ee00000020000000000000004554686520726563697069656e742077686f2063616e20736574746c65206f7220636c6f736520746865206368616e6e656c207573696e67206120636f6d6d69746d656e742e00000000000002746f0000000000130000000000000023546865205345502d343120746f6b656e207573656420666f72207061796d656e74732e0000000005746f6b656e00000000000013000000000000001b54686520696e697469616c206465706f73697420616d6f756e742e0000000006616d6f756e7400000000000b000000000000004d546865206e756d626572206f66206c656467657273207468652066756e6465722068617320746f2077616974206265666f726520726566756e6420616674657220636c6f73655f73746172742e00000000000015726566756e645f77616974696e675f706572696f6400000000000004000000000000000200000005000000f6456d6974746564207768656e206368616e6e656c20636c6f7365207374617274732c2065697468657220696d6d6564696174656c792076696120636c6f7365206f7220776974680a612077616974696e6720706572696f642076696120636c6f73655f73746172742e0a0a546865206566666563746976655f61745f6c6564676572206669656c6420696e64696361746573207768656e2074686520636c6f7365206973206566666563746976652e204966207468650a6669656c6420696e64696361746573207468652063757272656e74206c6564676572207468656e2074686520636c6f736520697320696d6d6564696174652e00000000000000000005436c6f73650000000000000100000005636c6f7365000000000000010000005f546865206c65646765722073657175656e6365206e756d6265722061742077686963682074686520636c6f7365206265636f6d65732065666665637469766520616e640a7468652066756e6465722063616e2063616c6c20726566756e642e00000000136566666563746976655f61745f6c656467657200000000040000000000000002000000050000003c456d6974746564207768656e207468652066756e646572207265636c61696d732072656d61696e696e672066756e64732076696120726566756e642e0000000000000006526566756e6400000000000100000006726566756e64000000000002000000235468652066756e6465722077686f2072656365697665642074686520726566756e642e000000000466726f6d00000013000000000000007454686520616d6f756e74207472616e7366657272656420746f207468652066756e6465722e20546869732069732074686520656e746972652072656d61696e696e670a62616c616e6365206f6620746865206368616e6e656c206174207468652074696d65206f662074686520726566756e642e00000006616d6f756e7400000000000b0000000000000002000000050000003e456d6974746564207768656e2074686520726563697069656e742072656365697665732066756e64732076696120736574746c65206f7220636c6f73652e00000000000000000008576974686472617700000001000000087769746864726177000000020000002554686520726563697069656e742077686f207265636569766564207468652066756e64732e00000000000002746f000000000013000000000000002854686520616d6f756e74207472616e7366657272656420746f2074686520726563697069656e742e00000006616d6f756e7400000000000b0000000000000002001e11636f6e7472616374656e766d6574617630000000000000001900000000006f0e636f6e74726163746d65746176300000000000000005727376657200000000000006312e39342e3100000000000000000008727373646b7665720000002f32352e332e3023646362656134343531336665623737333461663662366334616365643263346137613237313564300000530e636f6e74726163746d65746176300000000000000006636c6976657200000000002f32372e302e30233561376335666537363533306266343234383437376163383132666337353731343662393863633400" } }, "ext": "v0" diff --git a/contracts/channel-factory/test_snapshots/test/test_open_zero_amount.1.json b/contracts/channel-factory/test_snapshots/test/test_open_zero_amount.1.json new file mode 100644 index 0000000..8575daa --- /dev/null +++ b/contracts/channel-factory/test_snapshots/test/test_open_zero_amount.1.json @@ -0,0 +1,546 @@ +{ + "generators": { + "address": 6, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", + { + "function": { + "contract_fn": { + "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "function_name": "open", + "args": [ + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "bytes": "8139770ea87d175f56a35466c34c7ecccb8d8a91b4ee37a25df60f5b8fc9b394" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": "0" + }, + { + "u32": 100 + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CC2M56HX67JCKOOACM5O3QM77JFWUN43UILDM3AVFUZWWHTOAU3M3P4R", + "function_name": "__constructor", + "args": [ + { + "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "bytes": "8139770ea87d175f56a35466c34c7ecccb8d8a91b4ee37a25df60f5b8fc9b394" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": "0" + }, + { + "u32": 100 + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 25, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "WasmHash" + } + ] + }, + "val": { + "bytes": "4af52db3dba04b190ddd42cc27ae37b3835e399be842639f8e618f1838bcdcf0" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CC2M56HX67JCKOOACM5O3QM77JFWUN43UILDM3AVFUZWWHTOAU3M3P4R", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "4af52db3dba04b190ddd42cc27ae37b3835e399be842639f8e618f1838bcdcf0" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "CommitmentKey" + } + ] + }, + "val": { + "bytes": "8139770ea87d175f56a35466c34c7ecccb8d8a91b4ee37a25df60f5b8fc9b394" + } + }, + { + "key": { + "vec": [ + { + "symbol": "From" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "RefundWaitingPeriod" + } + ] + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "vec": [ + { + "symbol": "To" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": { + "v1": { + "ext": "v0", + "cost_inputs": { + "ext": "v0", + "n_instructions": 1810, + "n_functions": 48, + "n_globals": 4, + "n_table_entries": 0, + "n_types": 19, + "n_data_segments": 1, + "n_elem_segments": 0, + "n_imports": 20, + "n_exports": 18, + "n_data_segment_bytes": 329 + } + } + }, + "hash": "4af52db3dba04b190ddd42cc27ae37b3835e399be842639f8e618f1838bcdcf0", + "code": "0061736d01000000016f136000017e60017e017e60027e7e017e60037e7e7e017e60017f017e60027f7e0060027e7e0060037f7e7e0060017f0060027f7f006000017f60057e7e7e7e7e0060027f7f017e60017e017f60037f7f7f0060047f7f7f7f017e60000060067e7e7e7e7e7e017e60047e7e7e7f017e0279140164015f00030162015f00010163013000030161013000010178013700000178013100020178013600000164013000030176016700020169013800010169013700010169013600020162016a0002017801330000016201380001016c01310002016c01300002017801350001016c015f0003016d013900030331300b020c040d0109050609060e04040f0303040705050a08061008070805110002050a000000010000020000010012070405030100110621047f01418080c0000b7f0041cc82c0000b7f0041cc82c0000b7f0041d082c0000b07cd0112066d656d6f727902000d5f5f636f6e7374727563746f7200310762616c616e6365003205636c6f736500330b636c6f73655f73746172740036096465706f736974656400370466726f6d003812707265706172655f636f6d6d69746d656e74003906726566756e64003a15726566756e645f77616974696e675f706572696f64003b06736574746c65003c02746f003d05746f6b656e003e06746f705f7570003f0977697468647261776e0040015f03010a5f5f646174615f656e6403020b5f5f686561705f6261736503030c01010afd1c309f0101027f230041306b2206240020062003200410153703102006200237030820062001370300034020054118460440024041002105034020054118470440200641186a20056a200520066a290300370300200541086a21050c010b0b2000428eeeea95beb6def300200641186a41031016100042ff01834202520d00200641306a24000f0b05200641186a20056a4202370300200541086a21050c010b0b000b2d01017f230041106b22022400200220002001102620022802004101460440000b2002290308200241106a24000b16002000ad4220864204842001ad42208642048410080bee0102017f017e230041106b2201240002400240024002400240024002400240200041ff017141016b0e06010203040506000b200141c881c0004105101f0c060b200141cd81c0004104101f0c050b200141d181c000410d101f0c040b200141de81c0004102101f0c030b200141e081c0004113101f0c020b200141f381c000410f101f0c010b2001418282c0004116101f0b0240200128020045044020012903082102230041106b2200240020002002370308200041086a4101101621022001420037030020012002370308200041106a2400200129030821022001290300500d010b000b200141106a240020020b0b002000420210104201510b080020004202100f0b4202017e017f02402001101722021018047f20021019220242ff01834204520d012002422088a7210341010541000b210120002003360204200020013602000f0b000b0a00200010172001101c0b0b0020002001420210121a0b1100200010172001ad422086420484101c0b0e0041051017200020011015101c0bc40102037f017e027e0240200241094b0d00200221042001210503402006420886420e842004450d021a027f410120052d0000220341df00460d001a0240200341306b41ff0171410a4f0440200341c1006b41ff0171411a490d01200341e1006b41ff0171411a4f0d042003413b6b0c020b2003412e6b0c010b200341356b0bad42ff01832006420686842106200441016b2104200541016a21050c000b000b2001ad4220864204842002ad422086420484100c0b210620004200370300200020063703080b4f02017f027e230041106b220124002001200029030022033703004202210241012100034020000440200041016b2100200321020c010b0b20012002370308200141086a41011016200141106a24000b3402017f017e230041106b2201240020012000ad422086420484370308418481c0004101200141086a41011022200141106a24000b280020012003470440000b2000ad4220864204842002ad4220864204842001ad42208642048410130b0f00200020012002419881c00010410b0f0020002001200241b081c00010410b6a02017f017e230041306b22012400200141206a20002903002000290308102620012802204101460440000b2001200129032837030020012000290318370318200120002903103703102001200029032037030841ac82c00041042001410410221001200141306a24000b47002001423f8720028542005220014280808080808080407d42ffffffffffffffff005672047e20022001100b052001420886420b840b210120004200370300200020013703080b4602017f017e230041106b22022400024041021017220310180440200220031019102820022802004101470d01000b000b200229030820001025200110021a200241106a24000b0f00200020014280808080800410420b2f01027f230041106b22002400200041086a4104101a2000280208410171450440000b200028020c200041106a24000b3501027f230041106b22012400200141086a4106101a200128020c21022000200128020836020020002002360204200141106a24000b3101017e2001420059044041011043220210031a20002001845045044041001043200210042000200110140b0f0b102c000b0b0042838080801010111a0b0c002000410010431004102e0b5601017f230041206b220324002003200237030020032001428ed4e8d999b69e012003410110161000103020032802004101460440000b200329031021012000200329031837030820002001370300200341206a24000b5302017f027e230041206b22012400024020004105101722021018047e200120021019103020012802004101460d012001290318210320012903100542000b37030020002003370308200141206a24000f0b000b6d02017f017e2000027e024002402001a741ff0171220241c5004704402002410b470d0220002001423f87370318200020014208873703100c010b2001100921032001100a210120002003370318200020013703100b42000c010b20004283908080800137030842010b3703000b830202017f027e230041306b2206240002400240200042ff018342cd0052200142ff018342cd0052720d002006200210282006280200410146200342ff018342cd0052720d00200629030821022006200410302006280200410146200542ff0183420452720d00200629031822044200530d012006290310210741002000101b41012001101b410210172002101c41032003101b41042005422088a7101d20072004102b41e880c000102020072004101521042006200037032820062003370320200620054284808080708337031820062001370310200620023703082006200437030041b480c000410620064106102210051a200641306a240042020f0b000b102c000b2602017f017e230041106b220024002000102d200029030020002903081015200041106a24000ba30402027f047e230041f0006b22022400200241106a2203200010300240024002400240024020022802104101460d00200229032821002002290320210520032001103420022802104101460d0020004200530d012002290318210141031043220610031a100421041006210720022004370330200220073703282002428ef2b299bab6b6d10037032020022005370310200220003703182003200110272003102f200020022903182201852000200020017d20052002290310220454ad7d220185834200530d02200520047d220442005220014200552001501b0d030c040b000b102c000b000b20052000101e410010431004200620042001101441c081c0001020200420012006102410051a0b10352103200241086a102a024020022802084101710440200228020c20034d0d010b41062003101d419081c00010202003102110051a0b410110432101200241406b4100104322061004102e02402002290340220550200229034822004200532000501b0d0010042104200220052000101537036820022001370360200220043703584100210303402003411846044041002103034020034118470440200241106a20036a200241d8006a20036a290300370300200341086a21030c010b0b2006428eeeea95beb6def300200241106a41031016100742ff01834203510d0241a881c0001020200520002001102310051a05200241106a20036a4202370300200341086a21030c010b0b0b200241f0006a240042020b0f00200020014280808080800810420b0800100d422088a70b6f02037f017e230041106b22012400200141086a102a027e20012802084101710440200128020c21004283808080c000103520004f0d011a0b4101104310031a4106417f1029103522006a2202200020024b1b2200101d419081c00010202000102110051a42020b200141106a24000b6002017f047e230041106b220024002000102d20002903002102200029030821012000102f20012000290308220385427f8520012002200220002903007c220456ad200120037c7c220285834200530440000b200420021015200041106a24000b0600410110430b7902017f037e230041306b22012400200120001030024020012802004101470440200129031822004200530d01200129031021021004210310062104200120003703082001200237030020012003370320200120043703182001428ef2b299bab6b6d10037031020011025200141306a24000f0b000b102c000ba30102027f057e230041206b22002400200041086a102a0240200028020841017145044042838080802021020c010b200028020c21011035200149044042838080803021020c010b41011043220410031a200041106a4100104322061004102e420221022000290310220550200029031822034200532003501b0d0020061004200420052003101441a881c0001020200520032004102310051a0b200041206a240020020b0b001029ad4220864204840b8b0202017f047e230041306b2202240020022000103002400240024020022802004101460d00200229031821002002290310210420022001103420022802004101460d0020004200530d012002290308210141031043220510031a100421031006210620022003370320200220063703182002428ef2b299bab6b6d10037031020022004370300200220003703082002200110272002102f200020022903082201852000200020017d20042002290300220354ad7d220185834200530d02200420037d220342005220014200552001501b044020042000101e410010431004200520032001101441c081c0001020200320012005102410051a0b200241306a240042020f0b000b102c000b000b0600410310430b0600410010430b3401017f230041206b2201240020012000103020012802004101460440000b20012903102001290318102b200141206a240042020b2602017f017e230041106b220024002000102f200029030020002903081015200041106a24000b3401017f230041106b220424002000200110152100200420023703082004200037030020034102200441021022200441106a24000b3901017e420121030240200142ff018342c800520d002001100e428080808070832002520d0020002001370308420021030b200020033703000b5a02017f017e230041106b220124000240024020012000101722021018047e20021019220242ff018342cd00520d012001200237030842010542000b3703000c010b000b2001280200450440000b2001290308200141106a24000b0bd3020100418080c0000bc902616d6f756e74636f6d6d69746d656e745f6b657966726f6d726566756e645f77616974696e675f706572696f64746f746f6b656e0000100006000000060010000e000000140010000400000018001000150000002d001000020000002f00100005000000000000000eb35ad3000000006566666563746976655f61745f6c6564676572007000100013000000000000000e2a4ec728000000000010000600000014001000040000000ee9acafea0d000000001000060000002d001000020000000ebc79a76deef200546f6b656e46726f6d436f6d6d69746d656e744b6579546f526566756e6457616974696e67506572696f6457697468647261776e416d6f756e74436c6f736545666665637469766541744c65646765726368616e6e656c646f6d61696e6e6574776f726b000010000600000018011000070000001f01100006000000250110000700b33b0e636f6e7472616374737065637630000000000000004152657475726e732074686520726563697069656e7420616464726573732e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e00000000000002746f0000000000000000000100000013000000040000000000000000000000054572726f7200000000000004000000000000000e4e65676174697665416d6f756e7400000000000100000000000000094e6f74436c6f73656400000000000002000000000000001d526566756e6457616974696e67506572696f644e6f74456c617073656400000000000003000000000000000d416c7265616479436c6f73656400000000000004000000000000003e52657475726e73207468652066756e64657220616464726573732e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e00000000000466726f6d000000000000000100000013000000000000031e436c6f736520746865206368616e6e656c207573696e672061207369676e656420636f6d6d69746d656e742c207769746864726177696e672066756e647320746f207468650a726563697069656e742e2054686520616d6f756e74206973207468652063756d756c617469766520746f74616c2074686520726563697069656e7420697320656e7469746c65640a746f2e204f6e6c792074686520646966666572656e6365206265747765656e2074686520616d6f756e7420616e6420776861742068617320616c7265616479206265656e0a77697468647261776e206973207472616e736665727265642e0a0a4166746572207472616e7366657272696e672c20746869732066756e6374696f6e206175746f6d61746963616c6c7920617474656d70747320746f20726566756e64207468650a72656d61696e696e672062616c616e636520746f207468652066756e646572207573696e6720607472795f7472616e73666572602e205468697320726566756e640a617474656d70742077696c6c2073696c656e746c792073756363656564206f72206661696c20776974686f757420616666656374696e6720746865207769746864726177616c2e0a496620746865206175746f6d6174696320726566756e64206661696c732c207468652066756e6465722063616e2063616c6c205b60436f6e74726163743a3a726566756e64605d0a746f207265636c61696d207468652072656d61696e696e672062616c616e63652e0a0a43616e2062652063616c6c6564206576656e20616674657220746865206368616e6e656c20697320636c6f7365642c20757020756e74696c207468652066756e6465720a63616c6c73205b60436f6e74726163743a3a726566756e64605d20616e64207468652062616c616e636520697320647261696e65642e0a0a43616c6c61626c652062792074686520726563697069656e742028746f292e0a0a2320417574680a2d2060746f603a2072657175697265642e0a2d20436f6d6d69746d656e74207369676e61747572652073657276657320617320636f6d6d69746d656e745f6b657920617574686f72697a6174696f6e2e000000000005636c6f7365000000000000020000000000000006616d6f756e7400000000000b000000000000000373696700000003ee0000004000000000000000000000003d52657475726e732074686520746f6b656e20616464726573732e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e00000000000005746f6b656e00000000000000000000010000001300000002000000000000000000000007446174614b65790000000007000000000000000000000005546f6b656e00000000000000000000000000000446726f6d00000000000000000000000d436f6d6d69746d656e744b6579000000000000000000000000000002546f0000000000000000000000000013526566756e6457616974696e67506572696f640000000000000000000000000f57697468647261776e416d6f756e7400000000000000000000000016436c6f736545666665637469766541744c65646765720000000000000000016d526566756e64207468652072656d61696e696e672062616c616e636520746f207468652066756e6465722061667465722074686520636c6f7365206973206566666563746976652e0a0a43616e2062652063616c6c6564206d756c7469706c652074696d65732e20546869732069732075736566756c206966207468652066756e646572206163636964656e74616c6c790a6465706f73697473206164646974696f6e616c2066756e647320616674657220636c6f73696e6720e2809420746865792063616e2063616c6c20726566756e640a616761696e20746f207265636c61696d20746865206164646974696f6e616c2062616c616e63652e0a0a43616c6c61626c65206279207468652066756e646572202866726f6d292c2061667465722074686520636c6f7365206566666563746976655f61745f6c6564676572206861730a6265656e20726561636865642e0a0a2320417574680a2d206066726f6d603a2072657175697265642e00000000000006726566756e6400000000000000000001000003e90000000200000003000000000000030c536574746c652066756e647320746f2074686520726563697069656e74207573696e672061207369676e656420636f6d6d69746d656e7420776974686f757420636c6f73696e670a746865206368616e6e656c2e2054686520616d6f756e74206973207468652063756d756c617469766520746f74616c2074686520726563697069656e742069730a656e7469746c656420746f2e204f6e6c792074686520646966666572656e6365206265747765656e2074686520616d6f756e7420616e6420776861742068617320616c72656164790a6265656e2077697468647261776e206973207472616e736665727265642e0a0a54686520726563697069656e7420646f6573206e6f74206e65656420746f20736574746c6520616674657220657665727920636f6d6d69746d656e742e20546865792063616e0a616363756d756c617465206d756c7469706c6520636f6d6d69746d656e747320616e6420736574746c65207573696e67206f6e6c7920746865206c61746573740a286869676865737420616d6f756e742920636f6d6d69746d656e742e0a0a496620616e206f6c64657220636f6d6d69746d656e7420776974682061206c6f77657220616d6f756e74206973207573656420616674657220612068696768657220616d6f756e740a68617320616c7265616479206265656e2077697468647261776e2c206e6f2066756e647320617265207472616e736665727265642e0a0a43616e2062652063616c6c6564206576656e20616674657220746865206368616e6e656c20697320636c6f7365642c20757020756e74696c207468652066756e6465720a63616c6c73205b60436f6e74726163743a3a726566756e64605d20616e64207468652062616c616e636520697320647261696e65642e0a0a43616c6c61626c652062792074686520726563697069656e742028746f292e0a0a2320417574680a2d2060746f603a2072657175697265642e0a2d20436f6d6d69746d656e74207369676e61747572652073657276657320617320636f6d6d69746d656e745f6b657920617574686f72697a6174696f6e2e00000006736574746c650000000000020000000000000006616d6f756e7400000000000b000000000000000373696700000003ee00000040000000000000000000000123546f7020757020746865206368616e6e656c206279207472616e7366657272696e672074686520616d6f756e74206f6620746865206368616e6e656c7320746f6b656e2066726f6d207468652066756e646572202866726f6d0a61646472657373292e0a0a4e6f74653a205468652066756e6465722063616e20616c736f20746f7020757020746865206368616e6e656c206279207472616e7366657272696e6720746f6b656e730a6469726563746c7920746f20746865206368616e6e656c20636f6e74726163742061646472657373206f757473696465206f6620746869732066756e6374696f6e2e0a0a43616c6c61626c652062792066756e646572202866726f6d292e0a0a2320417574680a2d206066726f6d603a2072657175697265642e0000000006746f705f75700000000000010000000000000006616d6f756e7400000000000b00000000000000000000008752657475726e73207468652062616c616e6365206f6620746865206368616e6e656c2e205468697320697320746865206465706f736974656420616d6f756e740a6d696e757320616e7920616d6f756e7420616c72656164792077697468647261776e2e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e000000000762616c616e63650000000000000000010000000b0000000100000000000000000000000a436f6d6d69746d656e740000000000040000000000000006616d6f756e7400000000000b00000000000000076368616e6e656c00000000130000000000000006646f6d61696e00000000001100000000000000076e6574776f726b00000003ee0000002000000000000000c452657475726e732074686520746f74616c20616d6f756e74206465706f736974656420696e746f20746865206368616e6e656c2e0a0a54686973206973207468652062616c616e636520706c75732074686520616d6f756e7420616c72656164792077697468647261776e2e20526566756e6465640a616d6f756e74732061726520636f6e73696465726564206e6f206c6f6e676572206465706f73697465642e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e000000096465706f736974656400000000000000000000010000000b000000000000007752657475726e732074686520746f74616c20616d6f756e7420616c72656164792077697468647261776e2062792074686520726563697069656e74207669610a60736574746c6560206f722060636c6f7365602e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e000000000977697468647261776e00000000000000000000010000000b000000000000019d426567696e20636c6f73696e6720746865206368616e6e656c2c2065666665637469766520616674657220612077616974696e6720706572696f642e205468650a726563697069656e742063616e207374696c6c20736574746c65206f7220636c6f736520647572696e6720616e64206166746572207468652077616974696e670a706572696f642e2041667465722074686520636c6f7365206973206566666563746976652c207468652066756e6465722063616e2063616c6c20726566756e6420746f0a7265636c61696d207468652072656d61696e696e672062616c616e63652e0a0a2a2a496d706f7274616e743a2a2a2054686520726563697069656e742073686f756c6420736574746c65206f7220636c6f7365207768656e657665722074686579207365650a61205b606576656e743a3a436c6f7365605d2c206265666f7265207468652066756e6465722063616c6c732060726566756e64602e0a0a43616c6c61626c65206279207468652066756e646572202866726f6d292e0a0a2320417574680a2d206066726f6d603a2072657175697265642e0000000000000b636c6f73655f7374617274000000000000000001000003e9000000020000000300000000000003f24f70656e2061206368616e6e656c206279206465706f736974696e6720746f6b656e732066726f6d207468652066756e64657220746f2074686520636f6e74726163742e0a0a2d2060746f6b656e603a20546865205345502d343120746f6b656e207573656420666f72207061796d656e74732e0a2d206066726f6d603a205468652066756e6465722077686f206465706f7369747320746f6b656e7320696e746f20746865206368616e6e656c2e0a2d2060636f6d6d69746d656e745f6b6579603a205468652065643235353139207075626c6963206b6579207573656420746f2076657269667920636f6d6d69746d656e740a7369676e6174757265732e205365652060707265706172655f636f6d6d69746d656e746020666f722064657461696c73206f6e0a636f6d6d69746d656e74732e0a2d2060746f603a2054686520726563697069656e742077686f2063616e20736574746c65206f7220636c6f736520746865206368616e6e656c207573696e670a7369676e656420636f6d6d69746d656e74732e0a2d2060616d6f756e74603a2054686520696e697469616c206465706f73697420616d6f756e742e0a2d2060726566756e645f77616974696e675f706572696f64603a20546865206e756d626572206f66206c6564676572732074686520726563697069656e742068617320746f0a636c6f73652061667465722060636c6f73655f7374617274602069732063616c6c65642c206265666f72652060726566756e64600a6265636f6d657320617661696c61626c652e20546869732076616c75652073686f756c64206265206c6172676520656e6f75676820746f2067697665207468650a726563697069656e742074696d6520746f206f627365727665206120636c6f7365206576656e7420616e64207375626d6974206120636c6f73652c0a6f74686572776973652074686520726563697069656e74206d6179206e6f742061636365707420746865206368616e6e656c2e20486f77657665722c2069740a73686f756c64206e6f7420626520736f206c617267652074686174207468652066756e6465722063616e6e6f74207265636c61696d2066756e647320696e20610a74696d656c79206d616e6e65722e2053657474696e67207a65726f206f7220612076657279206c6f77206e756d62657220726573756c747320696e0a6e6561722d696d6d65646961746520726566756e64732c20776869636820697320616c6d6f7374206365727461696e6c79206e6f742075736566756c20666f720a656974686572207061727469636970616e742e0a0a43616c6c61626c6520627920746865206465706c6f7965722e0a0a2320417574680a2d206066726f6d603a2072657175697265642e00000000000d5f5f636f6e7374727563746f72000000000000060000000000000005746f6b656e00000000000013000000000000000466726f6d00000013000000000000000e636f6d6d69746d656e745f6b65790000000003ee000000200000000000000002746f0000000000130000000000000006616d6f756e7400000000000b0000000000000015726566756e645f77616974696e675f706572696f640000000000000400000000000000000000019e52657475726e7320746865205844522073657269616c697a6564206279746573206f66206120636f6d6d69746d656e7420666f722074686520676976656e20616d6f756e742e0a0a5468652072657475726e6564206279746573206d757374206265207369676e6564206279207468652065643235353139206b657920636f72726573706f6e64696e6720746f0a7468652060636f6d6d69746d656e745f6b6579602073746f72656420696e20746865206368616e6e656c2e2054686520726573756c74696e67207369676e61747572652c0a616c6f6e6720776974682074686520616d6f756e742c2063616e2062652070617373656420746f2060736574746c6560206f722060636c6f736560206279207468650a726563697069656e742e0a0a436f6d6d69746d656e747320617265207479706963616c6c79207072657061726564206f66662d636861696e2e20546869732066756e6374696f6e2069732070726f76696465640a6173206120636f6e76656e69656e63652e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e000000000012707265706172655f636f6d6d69746d656e740000000000010000000000000006616d6f756e7400000000000b000000010000000e000000000000005052657475726e732074686520726566756e642077616974696e6720706572696f6420696e206c6564676572732e0a0a43616c6c61626c6520627920616e796f6e652e0a0a2320417574680a4e6f6e652e00000015726566756e645f77616974696e675f706572696f640000000000000000000001000000040000000500000037456d6974746564207768656e20746865206368616e6e656c206973206f70656e6564207669612074686520636f6e7374727563746f722e0000000000000000044f70656e00000001000000046f70656e00000006000000315468652066756e6465722077686f206465706f736974656420746f6b656e7320696e746f20746865206368616e6e656c2e0000000000000466726f6d00000013000000000000003c5468652065643235353139207075626c6963206b6579207573656420746f2076657269667920636f6d6d69746d656e74207369676e6174757265732e0000000e636f6d6d69746d656e745f6b65790000000003ee00000020000000000000004554686520726563697069656e742077686f2063616e20736574746c65206f7220636c6f736520746865206368616e6e656c207573696e67206120636f6d6d69746d656e742e00000000000002746f0000000000130000000000000023546865205345502d343120746f6b656e207573656420666f72207061796d656e74732e0000000005746f6b656e00000000000013000000000000001b54686520696e697469616c206465706f73697420616d6f756e742e0000000006616d6f756e7400000000000b000000000000004d546865206e756d626572206f66206c656467657273207468652066756e6465722068617320746f2077616974206265666f726520726566756e6420616674657220636c6f73655f73746172742e00000000000015726566756e645f77616974696e675f706572696f6400000000000004000000000000000200000005000000f6456d6974746564207768656e206368616e6e656c20636c6f7365207374617274732c2065697468657220696d6d6564696174656c792076696120636c6f7365206f7220776974680a612077616974696e6720706572696f642076696120636c6f73655f73746172742e0a0a546865206566666563746976655f61745f6c6564676572206669656c6420696e64696361746573207768656e2074686520636c6f7365206973206566666563746976652e204966207468650a6669656c6420696e64696361746573207468652063757272656e74206c6564676572207468656e2074686520636c6f736520697320696d6d6564696174652e00000000000000000005436c6f73650000000000000100000005636c6f7365000000000000010000005f546865206c65646765722073657175656e6365206e756d6265722061742077686963682074686520636c6f7365206265636f6d65732065666665637469766520616e640a7468652066756e6465722063616e2063616c6c20726566756e642e00000000136566666563746976655f61745f6c656467657200000000040000000000000002000000050000003c456d6974746564207768656e207468652066756e646572207265636c61696d732072656d61696e696e672066756e64732076696120726566756e642e0000000000000006526566756e6400000000000100000006726566756e64000000000002000000235468652066756e6465722077686f2072656365697665642074686520726566756e642e000000000466726f6d00000013000000000000007454686520616d6f756e74207472616e7366657272656420746f207468652066756e6465722e20546869732069732074686520656e746972652072656d61696e696e670a62616c616e6365206f6620746865206368616e6e656c206174207468652074696d65206f662074686520726566756e642e00000006616d6f756e7400000000000b0000000000000002000000050000003e456d6974746564207768656e2074686520726563697069656e742072656365697665732066756e64732076696120736574746c65206f7220636c6f73652e00000000000000000008576974686472617700000001000000087769746864726177000000020000002554686520726563697069656e742077686f207265636569766564207468652066756e64732e00000000000002746f000000000013000000000000002854686520616d6f756e74207472616e7366657272656420746f2074686520726563697069656e742e00000006616d6f756e7400000000000b0000000000000002001e11636f6e7472616374656e766d6574617630000000000000001900000000006f0e636f6e74726163746d65746176300000000000000005727376657200000000000006312e39342e3100000000000000000008727373646b7665720000002f32352e332e3023646362656134343531336665623737333461663662366334616365643263346137613237313564300000530e636f6e74726163746d65746176300000000000000006636c6976657200000000002f32372e302e30233561376335666537363533306266343234383437376163383132666337353731343662393863633400" + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/channel/src/lib.rs b/contracts/channel/src/lib.rs index cc84b4a..8533e20 100644 --- a/contracts/channel/src/lib.rs +++ b/contracts/channel/src/lib.rs @@ -56,7 +56,7 @@ //! //! | Function | Description | //! |---|---| -//! | `__constructor` | Open a channel with an initial deposit. Callable by the funder, or anyone if amount is zero. | +//! | `__constructor` | Open a channel with an initial deposit. Callable by the deployer, authorized by the funder. | //! | `top_up` | Deposit additional tokens into the channel. | //! | `settle` | Withdraw funds using a signed commitment without closing the channel. | //! | `close` | Close the channel using a signed commitment, withdrawing funds to the recipient. Automatically attempts to refund the funder. | @@ -279,7 +279,7 @@ impl Contract { /// Callable by the deployer. /// /// # Auth - /// - `from`: required if amount > 0. + /// - `from`: required. pub fn __constructor(env: &Env, token: Address, from: Address, commitment_key: BytesN<32>, to: Address, amount: i128, refund_waiting_period: u32) { assert_with_error!(env, amount >= 0, Error::NegativeAmount); @@ -315,10 +315,10 @@ impl Contract { /// - `from`: required. pub fn top_up(env: &Env, amount: i128) { assert_with_error!(env, amount >= 0, Error::NegativeAmount); + let from = Self::from(env); + from.require_auth(); if amount > 0 { // Transfer tokens from the funder to the channel. - let from = Self::from(env); - from.require_auth(); Self::token_client(env).transfer(&from, &env.current_contract_address(), &amount); } } diff --git a/contracts/channel/src/test.rs b/contracts/channel/src/test.rs index ea44b59..16fae38 100644 --- a/contracts/channel/src/test.rs +++ b/contracts/channel/src/test.rs @@ -2,9 +2,9 @@ use ed25519_dalek::SigningKey; use soroban_sdk::{ - testutils::{Address as _, Events as _, Ledger}, + testutils::{Address as _, AuthorizedFunction, AuthorizedInvocation, Events as _, Ledger}, token::{StellarAssetClient, TokenClient}, - xdr, Address, BytesN, Env, + xdr, Address, BytesN, Env, IntoVal, Symbol, }; use crate::{Commitment, Contract, ContractClient}; @@ -579,7 +579,7 @@ fn test_refund_twice() { assert_eq!(token.balance(&funder), 1000); } -/// Top up with amount 0 is a no-op and does not require auth. +/// Top up with amount 0 still requires the funder's auth. #[test] fn test_top_up_zero() { let env = Env::default(); @@ -598,11 +598,53 @@ fn test_top_up_zero() { let client = ContractClient::new(&env, &channel_id); client.top_up(&0); - let auths = env.auths(); - assert!(auths.is_empty()); + assert_eq!( + env.auths(), + [( + funder.clone(), + AuthorizedInvocation { + function: AuthorizedFunction::Contract((channel_id.clone(), Symbol::new(&env, "top_up"), (0i128,).into_val(&env))), + sub_invocations: [].into(), + } + )] + ); assert_eq!(client.balance(), 500); } +/// Opening a channel with amount 0 still requires the funder's auth. +#[test] +fn test_open_zero_amount() { + let env = Env::default(); + env.mock_all_auths(); + + let auth_key = SigningKey::from_bytes(&[27u8; 32]); + let auth_pubkey = BytesN::from_array(&env, &auth_key.verifying_key().to_bytes()); + + let to = Address::generate(&env); + let funder = Address::generate(&env); + + let (token_addr, token, asset_admin) = create_token(&env); + asset_admin.mint(&funder, &1000); + + let channel_id = env.register(Contract, (token_addr.clone(), funder.clone(), auth_pubkey.clone(), to.clone(), 0i128, 100u32)); + assert_eq!( + env.auths(), + [( + funder.clone(), + AuthorizedInvocation { + function: AuthorizedFunction::Contract(( + channel_id.clone(), + Symbol::new(&env, "__constructor"), + (token_addr.clone(), funder.clone(), auth_pubkey.clone(), to.clone(), 0i128, 100u32).into_val(&env), + )), + sub_invocations: [].into(), + } + )] + ); + assert_eq!(token.balance(&channel_id), 0); + assert_eq!(token.balance(&funder), 1000); +} + /// Refund succeeds at exactly the effective_at_ledger. #[test] fn test_refund_at_exact_effective_ledger() { diff --git a/contracts/channel/test_snapshots/test/test_open_zero_amount.1.json b/contracts/channel/test_snapshots/test/test_open_zero_amount.1.json new file mode 100644 index 0000000..41e518c --- /dev/null +++ b/contracts/channel/test_snapshots/test/test_open_zero_amount.1.json @@ -0,0 +1,433 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "__constructor", + "args": [ + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "bytes": "1e2a137c7fe2279f9d7f0644030a0e9c0b45f781dce71ae4519c0f4384031654" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "i128": "0" + }, + { + "u32": 100 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 25, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "CommitmentKey" + } + ] + }, + "val": { + "bytes": "1e2a137c7fe2279f9d7f0644030a0e9c0b45f781dce71ae4519c0f4384031654" + } + }, + { + "key": { + "vec": [ + { + "symbol": "From" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "RefundWaitingPeriod" + } + ] + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "vec": [ + { + "symbol": "To" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000004" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/channel/test_snapshots/test/test_top_up_zero.1.json b/contracts/channel/test_snapshots/test/test_top_up_zero.1.json index 0026751..67ff18b 100644 --- a/contracts/channel/test_snapshots/test/test_top_up_zero.1.json +++ b/contracts/channel/test_snapshots/test/test_top_up_zero.1.json @@ -101,7 +101,25 @@ } ] ], - [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "top_up", + "args": [ + { + "i128": "0" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [] ], "ledger": { @@ -175,6 +193,26 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0,